Skip to content

Latest commit

 

History

History
88 lines (73 loc) · 3.06 KB

File metadata and controls

88 lines (73 loc) · 3.06 KB

Java学习笔记-05 I/O

参考文档:
1.IBM——深入分析Java I/O的工作机制
2.Java核心技术卷2 输入和输出
3.博客园:InputStream和Reader的区别

1 Java I/O基本结构

与C语言只有单一类型FILE*包打天下不同,Java拥有一个流家族,按照它们的使用方法进行划分,这样就形成了处理字节字符的两个单独的层次结构。其中InputStreamOutputStream为字节输入/输出流;ReaderWriter为字符输入/输出流。这四个均为抽象类。
另外,基于磁盘操作的I/O接口为File,基于网络操作的I/O接口为Socket

1.1 字符流

基于字符的I/O操作接口为ReaderWriter,它们常用的类继承层次如下表所示:

输入流的子类 子类的继承类
BufferedReader LineNumberReader
CharArrayReader -
FilterReader PushbackReader
InputStreamReader FileReader
PipedReader -
StringReader -
输出流的子类 子类的继承类
BufferWriter -
CharArrayWriter -
FilterWriter -
OutputStreamWriter FileWriter
PipedWriter -
PrintWriter -
StringWriter -

1.2 字节流

基于字节的I/O操作接口为InputStreamOutputStream,它们常用的类继承层次如下表所示:

输入流的子类 子类的继承类
ByteArrayInputStream -
FileInputStream SocketInputStream
FilterInputStream InflaterInputStream<-ZipInputStream
BufferedInputStream
DataInputStream
ObjectInputStream -
PipedInputStream -
输出流的子类 子类的继承类
ByteArrayOutputStream -
FileOutputStream SocketOutputStream
FilterOutputStream DataOutputStream
PrintStream
ZipOutputStream
ObjectOutputStream -
PipedOutputStream -

1.3 实例

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();
    }
}