【Java】一文带你理清Java中输入输出流、文件读写、Reader/Writer的关系

一文带你理清Java中输入输出流、文件读写、Reader/Writer的关系

前言

在Java编程中,输入输出流以及文件读写是基础而重要的概念,对于初学者来说,理解它们的关系有助于更好地进行文件操作。本文将深入解析Java中输入输出流、文件读写、Reader/Writer之间的关系,为你提供一个清晰的认识。

1. 输入输出流的基础

Java的输入输出流是处理字节流和字符流的两个基本类层次结构。其中,字节流以InputStreamOutputStream为核心,而字符流则以ReaderWriter为核心。这两者的区别在于处理的数据单元不同,字节流操作的是原始的字节,而字符流则操作的是Unicode字符。

2. 文件读写与流的关系

文件读写通常需要使用输入输出流,其中FileInputStreamFileOutputStream是常用的字节流,而FileReaderFileWriter则是常用的字符流。这些类能够方便地对文件进行读写操作。

// 使用FileInputStream和FileOutputStream进行文件字节流读写
try (FileInputStream fis = new FileInputStream("input.txt");
     FileOutputStream fos = new FileOutputStream("output.txt")) {
    int data;
    while ((data = fis.read()) != -1) {
        fos.write(data);
    }
}
​
// 使用FileReader和FileWriter进行文件字符流读写
try (FileReader fr = new FileReader("input.txt");
     FileWriter fw = new FileWriter("output.txt")) {
    int data;
    while ((data = fr.read()) != -1) {
        fw.write(data);
    }
}

3. Reader和Writer的角色

ReaderWriter是字符流的基本类,它们分别负责字符的读取和写入。与字节流相比,字符流更适合处理文本文件。

// 使用FileReader和FileWriter进行字符流读写
try (FileReader fr = new FileReader("input.txt");
     FileWriter fw = new FileWriter("output.txt")) {
    int data;
    while ((data = fr.read()) != -1) {
        fw.write(data);
    }
}

4. InputStreamReader和OutputStreamWriter的妙用

InputStreamReaderOutputStreamWriter是字节流到字符流的桥梁,它们可以将字节流转换为字符流。这在处理文件编码不同时非常有用。

// 使用InputStreamReader和OutputStreamWriter进行编码转换
try (FileInputStream fis = new FileInputStream("input.txt");
     FileOutputStream fos = new FileOutputStream("output.txt");
     InputStreamReader isr = new InputStreamReader(fis, StandardCharsets.UTF_8);
     OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
    int data;
    while ((data = isr.read()) != -1) {
        osw.write(data);
    }
}

5. BufferedReader和BufferedWriter的优势

BufferedReaderBufferedWriter是字符流的缓冲区类,它们能够提高读写效率,特别是在大量数据操作时。它们通常搭配ReaderWriter一同使用。

// 使用BufferedReader和BufferedWriter进行字符流读写
try (BufferedReader br = new BufferedReader(new FileReader("input.txt"));
     BufferedWriter bw = new BufferedWriter(new FileWriter("output.txt"))) {
    String line;
    while ((line = br.readLine()) != null) {
        bw.write(line);
        bw.newLine();  // 换行
    }
}

6. 小结

通过以上例子,我们对Java中输入输出流、文件读写、Reader/Writer的关系有了更加清晰的认识。这些类的灵活组合可以满足不同场景下对文件操作的需求,同时提高了文件读写的效率。在实际应用中,根据具体需求选择合适的流类别,能够更好地完成文件处理任务。

你可能感兴趣的:(小白,java)