欢迎访问宙启技术站
智能推送

如何使用Java中的IO函数处理文件流?

发布时间:2023-06-20 13:08:04

Java中处理文件流的方法是通过IO输入输出流的方式来完成的。尤其是在处理大型文件或需要按照二进制方式处理文件时,使用IO工具包来处理文件及流十分方便。下面,我们将向您介绍Java的IO功能。

一、Java中IO流的概述

IO(Input Output)流可以理解为Java中数据输入输出的方式。在Java中IO流分为两类,即字节流和字符流。其中字节流是按照字节为单位的输入输出,用于处理二进制文件,而字符流以字符为单位的输入输出,用于处理文本文件。

Java中IO流主要在java.io包中,提供了丰富的IO类和接口,支持开发者读取、写入、修改或删除文件。它们的基本关系如下图所示:

![image.png](https://cdn.nlark.com/yuque/0/2021/png/219363/1635571144205-982feafe-bcf9-4d1d-b6d2-4635c88e54f6.png#clientId=u7c5c87ce-a55e-4&from=paste&height=299&id=uacde8620&margin=%5Bobject%20Object%5D&name=image.png&originHeight=299&originWidth=884&originalType=binary&ratio=1&size=18953&status=done&style=none&taskId=udb0b7d7c-8e5e-46c5-8dd0-c1a4e8a87e6)

从上图我们可以看到,InputStream和OutputStream是所有字节流的直接父类,Reader和Writer是所有字符流的直接父类。然后,FileInputStream、FileOutputStream和RandomAccessFile继承了InputStream和OutputStream,用于读写文件和二进制数据。FileReader、FileWriter、BufferedReader和PrintWriter继承了Reader和Writer,用于读写文本文件。

二、Java中IO流的分类

在Java中,根据数据流的类型和处理方式,可以将IO流分为以下几种:

1. 字节流

按照字节为单位进行输入输出的IO操作,主要用于操作二进制文件。在Java中,字节流主要有InputStream和OutputStream两个抽象类,以及其子类FileInputStream/FileOutputStream、ByteArrayInputStream/ByteArrayOutputStream、PipedInputStream/PipedOutputStream等。

2. 字符流

按照字符为单位进行输入输出的IO操作,主要用于操作文本文件,字符流在内存中表现为Unicode字符。在Java中,字符流主要有Reader和Writer两个抽象类,以及其子类FileReader/FileWriter、BufferedReader/BufferedWriter、InputStreamReader/OutputStreamWriter等。

3. 节点流

直接和数据源相连接的流称为节点流。在Java中,节点流有两个主要的超类:InputStream和OutputStream。在使用网络连接(如TCP/IP)时,流可以在Socket或ServerSocket上构建,用于与其他计算机上的程序进行通信。此时的数据都是以字节块的形式传输。

4. 处理流

处理流也称为包装流,可以将节点流包装起来,使读写操作变得更为方便。处理流可分为字节处理流和字符处理流两种。在Java中,字符处理流主要由BufferedReader和BufferedWriter、PrintWriter等类提供,而字节处理流主要由DataInputStream和DataOutputStream、BufferdInputStream和BufferedOutputStream、ObjectInputStream和ObjectOutputStream、FileInputStream和FileOutputStream提供。

5. 对象流

对象流是Java中一种处理对象的方式。它可以将对象序列化到内存缓存或文件中,以便在另一个时间或系统中进行反序列化。 Java中,对象流由ObjectInputStream和ObjectOutputStream类提供,用于存储和读取Java对象。

三、如何使用Java中IO函数处理文件流

1. 字节输入流

在Java中读取文件的最基本方法是使用字节输入流。在Java中,字节输入流是InputStream类的抽象类,可通过多种类(如FileInputStream、ByteArrayInputStream等)创建具体实例。

下面是一个从文件中读取文本的示例:

1. 创建一个输入流实例。

try (
    // 定义路径以及文件名
    InputStream inputStream = new FileInputStream("test.txt");
) {
}

2. 打开文件并读取内容。

try (
    // 定义路径以及文件名
    InputStream inputStream = new FileInputStream("test.txt");
) {
    byte[] buffer = new byte[1024];
    int len = inputStream.read(buffer);
    while (len != -1) {
        String content = new String(buffer, 0, len);
        System.out.println(content);
        len = inputStream.read(buffer);
    }
}

2. 字节输出流

Java中,字节输出流是OutputStream类的一种,可以用于向文件写入数据。一般,通过FileOutputStream或ByteArrayOutputStream来实现。

下面代码是向文件中追加数据的示例:

try (
    OutputStream outputStream = new FileOutputStream("test.txt", true);
) {
    byte[] content = "Hello World!".getBytes();
    outputStream.write(content);
}

3. 字符输入流

在Java中,字符输入流是Reader类的抽象类,它可以将输入流中的字节转换为字符,使我们可以读取和处理文本文件。常用的子类有FileReader和InputStreamReader。

以下是Java读取文本文件的示例:

try (
    Reader reader = new FileReader("test.txt");
    BufferedReader bufferedReader = new BufferedReader(reader);
) {
    String line;
    while ((line = bufferedReader.readLine()) != null) {
        System.out.println(line);
    }
}

4. 字符输出流

Java中字符输出流是Writer类的抽象类,用于写入字符流。Writer类的常用子类是FileWriter。

下面代码是向文件中写入数据的示例:

try (
    Writer writer = new FileWriter("test.txt", true);
) {
    String content = "Hello World!";
    writer.write(content);
}

5. 缓存输入输出流

缓存输入输出流是数据处理中常用的一种优化方式。它提供了缓存区的功能,可以提高数据处理的效率。

以下是Java中采用缓存流处理数据的示例:

try (
    InputStream inputStream = new FileInputStream("test.txt");
    BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
) {
    byte[] buffer = new byte[1024];
    int len = bufferedInputStream.read(buffer);
    while (len != -1) {
        System.out.println(new String(buffer, 0, len));
        len = bufferedInputStream.read(buffer);
    }
}

6. 数据输入输出流

Java中,数据输入输出流是处理基础数据类型的数据流。数据输入输出流提供了方便的方法来读和写基本数据类型和对象类型。常用的子类包括:DataInputStream和DataOutputStream。

以下是Java中使用数据输入输出流读写数据的示例:

try (
    OutputStream outputStream = new FileOutputStream("test.txt");
    DataOutputStream dos = new DataOutputStream(outputStream);
) {
    dos.writeUTF("JavaCodeGeeks!");
}
try (
    InputStream inputStream = new FileInputStream("test.txt");
    DataInputStream dis = new DataInputStream(inputStream);
) {
    String data = dis.readUTF();
    System.out.println(data);
}

Java IO流类库是一个强大和有用的类库,可以让开发者方便地处理输入和输出。除了上述所提到的几种输入输出流,Java中还包括了其他很多流,可以支持多种不同的输入、输出场景。在实际开发中,开发者可以根据自己的需要,选择最合适的输入输出流。