参考文档:
1.IBM——深入分析Java I/O的工作机制
2.Java核心技术卷2 输入和输出
3.博客园:InputStream和Reader的区别
与C语言只有单一类型FILE*包打天下不同,Java拥有一个流家族,按照它们的使用方法进行划分,这样就形成了处理字节和字符的两个单独的层次结构。其中InputStream和OutputStream为字节输入/输出流;Reader和Writer为字符输入/输出流。这四个均为抽象类。
另外,基于磁盘操作的I/O接口为File,基于网络操作的I/O接口为Socket。
基于字符的I/O操作接口为Reader和Writer,它们常用的类继承层次如下表所示:
| 输入流的子类 | 子类的继承类 |
|---|---|
| BufferedReader | LineNumberReader |
| CharArrayReader | - |
| FilterReader | PushbackReader |
| InputStreamReader | FileReader |
| PipedReader | - |
| StringReader | - |
| 输出流的子类 | 子类的继承类 |
|---|---|
| BufferWriter | - |
| CharArrayWriter | - |
| FilterWriter | - |
| OutputStreamWriter | FileWriter |
| PipedWriter | - |
| PrintWriter | - |
| StringWriter | - |
基于字节的I/O操作接口为InputStream和OutputStream,它们常用的类继承层次如下表所示:
| 输入流的子类 | 子类的继承类 |
|---|---|
| ByteArrayInputStream | - |
| FileInputStream | SocketInputStream |
| FilterInputStream | InflaterInputStream<-ZipInputStream BufferedInputStream DataInputStream |
| ObjectInputStream | - |
| PipedInputStream | - |
| 输出流的子类 | 子类的继承类 |
|---|---|
| ByteArrayOutputStream | - |
| FileOutputStream | SocketOutputStream |
| FilterOutputStream | DataOutputStream PrintStream ZipOutputStream |
| ObjectOutputStream | - |
| PipedOutputStream | - |
Q:将a.txt和b.txt文件中的内容按行交替存至c.txt。
import java.io.*;
public class FileDemo {
public static void main(String[] args) throws IOException {
FileReader fileReaderA = new FileReader("src/a.txt");
FileReader fileReaderB = new FileReader("src/b.txt");
//BufferedReader是字符缓冲流,减少访问IO的次数
BufferedReader bufferedReaderA = new BufferedReader(fileReaderA);
BufferedReader bufferedReaderB = new BufferedReader(fileReaderB);
FileWriter fileWriter = new FileWriter("src/c.txt");
BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
String line1 = bufferedReaderA.readLine(), line2 = bufferedReaderB.readLine();
while (line1 != null || line2 != null) {
if (line1 != null) {
bufferedWriter.write(line1 + "\n");
line1 = bufferedReaderA.readLine();
}
if (line2 != null) {
bufferedWriter.write(line2 + "\n");
line2 = bufferedReaderB.readLine();
}
}
bufferedWriter.close();
bufferedReaderA.close();
bufferedReaderB.close();
}
}