相关文章推荐
·  阅读 换个角度思考Java IO中各种流的分类和实际应用

Java IO (输入输出)是任何编程语言中最常用的部分之一,它提供了在程序中读取和写入数据的方法。Java IO库包含多个类和接口,这些类和接口被组织成不同的包,每个包都有一个特定的目的或功能。Java IO库中最重要的概念之一是流(Stream)。流表示数据在程序中的传递方式。在这篇文章中,我们将深入了解Java IO中各种流的分类和实际应用。

Java IO库提供了众多可用于读写数据流的类,这些类主要分为四类:字节流、字符流、节点流和处理流。下面是一些常用的Java IO流类:

1.字节流

InputStream:抽象类,所有字节输入流的父类。

FileInputStream:读取文件中的数据。

ObjectInputStream:读取Java对象的序列化形式。

BufferedInputStream:缓存输入流,提高读取速度。

DataInputStream:允许Java程序以与机器无关方式从底层输入流中读取基本Java数据类型。

OutputStream:抽象类,所有字节输出流的父类。

FileOutputStream:向文件中写入数据。

ObjectOutputStream:将Java对象写入输出流并序列化。

BufferedOutputStream:缓存输出流,提高写入速度。

DataOutputStream:允许Java程序以与机器无关方式从底层输出流中写入基本Java数据类型。

2. 字符流

Reader:抽象类,所有字符输入流的父类。

FileReader:读取文件中的字符。

BufferedReader:缓存输入流,提高读取速度。

InputStreamReader:将字节流转换为字符流。

Writer:抽象类,所有字符输出流的父类。

FileWriter:向文件中写入字符。

BufferedWriter:缓存输出流,提高写入速度。

OutputStreamWriter:将字符流转换为字节流。

3. 节点流

  • FileInputStream:读取文件中的数据。
  • FileOutputStream:向文件中写入数据。
  • RandomAccessFile:允许Java程序直接访问任意位置的文件数据。
  • 4. 处理流

  • BufferedInputStream:缓存输入流,提高读取速度。
  • BufferedOutputStream:缓存输出流,提高写入速度。
  • DataInputStream:允许Java程序以与机器无关方式从底层输入流中读取基本数据类型。
  • DataOutputStream:允许Java程序以与机器无关方式从底层输出流中写入基本数据类型。
  • PrintStream:打印各种数据值表示形式的输出流。
  • PrintWriter:格式化输出流,可以输出各种数据类型和格式的值。
  • 除了上述列出的常用流类,Java IO库中还有许多其他流实现可供选择,并可以通过这些流类构建自定义流。

    一、 流的概念

    流是一个连续的字节序列,可以从一个地方流动到另一个地方。在Java中,流代表数据的“面向字节”的传输,这意味着数据以字节的形式读取或写入。Java中的流被定义为InputStream和OutputStream,它们是所有流的基本接口。Java还提供了Reader和Writer接口,这些接口处理字符流。

    二、 流的分类

    Java中的流可分为四种类型:字节流、字符流、节点流和处理流。

    (1)字节流

    字节流以byte为单位读写数据,它可以读取任意类型的文件,包括图像、文档等。字节流主要有InputStream和OutputStream两种类型。InputStream提供了多种方法来读取字节数据,例如read(),read(byte[] b)等,而OutputStream可以将字节写入文件中,例如write(int b),write(byte[] b)等。以下是InputStream和OutputStream的示例代码:

    // 从文件中读取字节
    InputStream inputStream = new FileInputStream("example.txt");
    int b;
    while ((b = inputStream.read()) != -1) {
        System.out.write(b);
    inputStream.close();
    // 将字节写入文件中
    byte[] bytes = "hello world".getBytes();
    OutputStream outputStream = new FileOutputStream("example.txt");
    outputStream.write(bytes, 0, bytes.length);
    outputStream.close();
    

    (2)字符流

    字符流以char为单位读写数据,它可以处理纯文本文件,并且具有更高的效率。Java提供了两种类型的字符流:Reader和Writer。Reader提供了多种方法来读取字符数据,例如read(),read(char[] cbuf),而Writer可以将字符写入文件中,例如write(int c),write(char[] cbuf)等。以下是Reader和Writer的示例代码:

    // 从文件中读取字符
    Reader reader = new FileReader("example.txt");
    int c;
    while ((c = reader.read()) != -1) {
        System.out.print((char) c);
    reader.close();
    // 将字符写入文件中
    char[] chars = "hello world".toCharArray();
    Writer writer = new FileWriter("example.txt");
    writer.write(chars, 0, chars.length);
    writer.close();
    

    (3)节点流

    节点流直接从一个外部源(如文件或网络套接字)读取数据或写入数据,这些流称为节点流。在Java IO库中,FileInputStream、FileOutputStream等都属于节点流。以下是FileInputStream和FileOutputStream的示例代码:

    // 从文件中读取字节
    FileInputStream inputStream = new FileInputStream("example.txt");
    int b;
    while ((b = inputStream.read()) != -1) {
        System.out.write(b);
    inputStream.close();
    // 将字节写入文件中
    byte[] bytes = "hello world".getBytes();
    FileOutputStream outputStream = new FileOutputStream("example.txt");
    outputStream.write(bytes, 0, bytes.length);
    outputStream.close();
    

    (4)处理流

    处理流是一个连接到另一个流的流,处理流本身并不存储数据,但它可以对数据进行加工、转换等操作。Java提供了许多处理流,例如BufferedInputStream、BufferedOutputStream等。BufferedInputStream和BufferedOutputStream 可以用来提高读写速度。以下是BufferedInputStream和BufferedOutputStream的示例代码:

    // 从文件中读取字节
    InputStream inputStream = new FileInputStream("example.txt");
    BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
    int b;
    while ((b = bufferedInputStream.read()) != -1) {
        System.out.write(b);
    bufferedInputStream.close();
    inputStream.close();
    // 将字节写入文件中
    byte[] bytes = "hello world".getBytes();
    OutputStream outputStream = new FileOutputStream("example.txt");
    BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
    bufferedOutputStream.write(bytes, 0, bytes.length);
    bufferedOutputStream.flush();
    bufferedOutputStream.close();
    outputStream.close();
    

    三、 流的应用

    Java IO的流具有广泛的应用,以下是一些实际应用场景:

    从文件中读取数据:
    使用FileInputStream或FileReader读取文件数据是很常见的操作。以下是一个使用BufferedReader读取文件的示例代码:

    BufferedReader reader = new BufferedReader(new FileReader("example.txt"));
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    reader.close();
    

    将数据写入文件:

    使用FileOutputStream或FileWriter将数据写入文件是很常见的操作。以下是一个使用BufferedWriter写入文件的示例代码:

    BufferedWriter writer = new BufferedWriter(new FileWriter("example.txt"));
    writer.write("hello world");
    writer.newLine();
    writer.flush();
    writer.close();
    

    从网络中读取数据:

    Java中也可以通过网络获取数据,使用Socket类可以从URL或HTTP服务器读取数据。以下是一个使用Socket读取数据的示例代码:

    Socket socket = new Socket("www.example.com", 80);
    InputStream inputStream = socket.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    reader.close();
    inputStream.close();
    socket.close();
    

    四、 总结

    在这篇文章中,我们深入了解了Java IO中各种流的分类和实际应用。由于面向字节的流和字符流(面向字符的流)具有不同的目的和特点,因此选择正确的流类型对于正确完成任务非常重要。在实际开发中,我们需要根据应用场景选择适当的流类型来处理输入输出。

     
    推荐文章