在Java里,输入输出流(I/O流)是用来处理数据输入和输出的重要机制。I/O流主要分为以下几类:

按流向分类

  1. 输入流(InputStream/Reader):用于从数据源(像文件、网络连接等)读取数据。
  2. 输出流(OutputStream/Writer):用于将数据写入到目标(如文件、网络连接等)。

按处理数据的单位分类

  1. 字节流(InputStream/OutputStream):以字节(8位)为单位处理数据。适用于处理二进制数据,像图片、音频、视频等。
  2. 字符流(Reader/Writer):以字符(16位)为单位处理数据。适用于处理文本数据,能自动处理字符编码和解码。

按功能分类

  1. 节点流:直接与数据源或目标相连,负责实际的数据读写。
  2. 处理流:对节点流进行包装,增强其功能,比如提供缓冲、加密等功能。

各类流的区别

字节流和字符流

  • 处理数据单位:字节流以字节为单位处理数据,而字符流以字符为单位处理数据。
  • 适用场景:字节流适用于处理二进制数据,字符流适用于处理文本数据。
  • 编码处理:字节流不会自动处理字符编码,而字符流会自动处理字符编码和解码。

输入流和输出流

  • 流向:输入流用于从数据源读取数据,输出流用于将数据写入到目标。
  • 方法:输入流通常有read()方法用于读取数据,输出流通常有write()方法用于写入数据。

节点流和处理流

  • 功能:节点流负责实际的数据读写,处理流用于增强节点流的功能。
  • 使用方式:处理流需要包装节点流使用,不能单独使用。

示例代码

以下是字节流和字符流的简单示例:

import java.io.*;

public class IOStreamExample {
    public static void main(String[] args) {
        // 字节流示例
        try (FileInputStream fis = new FileInputStream("input.txt");
             FileOutputStream fos = new FileOutputStream("output.txt")) {
            int byteData;
            while ((byteData = fis.read()) != -1) {
                fos.write(byteData);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 字符流示例
        try (FileReader fr = new FileReader("input.txt");
             FileWriter fw = new FileWriter("output.txt")) {
            int charData;
            while ((charData = fr.read()) != -1) {
                fw.write(charData);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这个示例中,FileInputStreamFileOutputStream属于字节流,FileReaderFileWriter属于字符流。