说明,本文内容来源于java io系列01之 “目录”,做了一些删减。
Java库的IO分为输入/输出两部分。
早期的Java 1.0版本的输入系统是InputStream及其子类,输出系统是OutputStream及其子类。
后来的Java 1.1版本对IO系统进行了重新设计。输入系统是Reader及其子类,输出系统是Writer及其子类。
Java1.1之所以要重新设计,主要是为了添加国际化支持(即添加了对16位Unicode码的支持)。具体表现为Java 1.0的IO系统是字节流,而Java 1.1的IO系统是字符流。
字节流,就是数据流中最小的数据单元是8位的字节。
字符流,就是数据流中最小的数据单元是16位的字符。
字节流在操作的时候,不会用到缓冲;而字符流会用到缓冲。所以,字符流的效率会更高一些。
至于为什么用到缓冲会效率更高一些呢?那是因为,缓冲本质上是一段内存区域;而文件大多是存储在硬盘或者Nand Flash上面。读写内存的速度比读写硬盘或Nand Flash上文件的速度快很多!
目前,文件大多以字节的方式存储的。所以在开发中,字节流使用较为广泛。
Java 1.0和Java 1.1 的IO类的比较
基本类对比表
Java 1.0 IO基本类(字节流) | Java 1.1 IO基本类(字符流) |
---|---|
InputStream | Reader |
OutputStream | Writer |
FileInputStream | FileReader |
FileOutputStream | FileWriter |
StringBufferInputStream | StringReader |
无 | StringWriter |
ByteArrayInputStream | CharArrayReader |
ByteArrayOutputStream | CharArrayWriter |
PipedInputStream | PipedReader |
PipedOutputStream | PipedWriter |
装饰器对比表
Java 1.0 IO装饰器(字节流) | Java 1.1 IO装饰器(字符流) |
---|---|
FilterInputStream | FilterReader |
FilterOutputStream | FilterWriter(没有子类的抽象类 |
BufferedInputStream | BufferedReader(也有 readLine()) |
BufferedOutputStream | BufferedWriter |
DataInputStream | 无 |
PrintStream | PrintWriter |
LineNumberInputStream | LineNumberReader |
StreamTokenizer | 无 |
PushBackInputStream | PushBackReader |
io框架
以字节为单位的输入流的框架图:
是以字节为单位的输出流的框架图:
以字节为单位的输入流和输出流关联的框架图:
以字符为单位的输入流的框架图:
以字符为单位的输出流的框架图:
以字符为单位的输入流和输出流关联的框架图:
字节转换为字符流的框架图:
字节和字符的输入流对应关系:
字节和字符的输出流对应关系: