基本 IO
重要接口
重要类
字节类
InputStream
特点: 读取字节流的抽象类
BufferedInputStream
特点:
- 用字节缓冲区来从
InputStream
中读取流 - 缓冲区默认大小是 8K, 可能会增长
- 实现了
mark()
和reset()
方法 fill()
方法
ByteArrayInputStream
特点:
- 从内存中的字节数组的字节读取流
- 实现了
mark()
和reset()
DataInputStream
特点:
- 允许从下层流中以Java基本数据类型
- 一个应用可以用
DataOutputStream
写入流再用DataInputStream
读出
FilterInputStream
特点:
- 建立在其他流之上, 提供附加功能
OutputStream
特点: 写入字节流的抽象类
BufferedOutputStream
特点: 增加了缓冲区, 使得不用每次 write()
都调用底层流 write()
ByteArrayOutputStream
特点: 将字节写入内存中的一段区域
DataOutputStream
特点:
- 将基础类型数据写入流, 可移植
- 读取时要用
DateInputStream
FilterOutputStream
特点: 为其他流提供附加功能的装饰流父类
字符类
Reader
特点: 读取字符流的抽象类
BufferedReader
特点:
- 从字符流中读取文本到缓冲区, 以便更有效地被读取.
- 缓冲区默认大小是8192(8KB).
- 建议任何字符流的
Reader
都被BufferedReader
所装饰. 否则每个read()
操作都会调用底层read()
的操作.
LineNumberReader
特点: 在 BufferedReader
基础上保留了追踪行号
CharArrayReader
特点: 从内存缓冲区中读取字符到另外一个缓冲区
InputStreamReader
特点:
- 用于桥接一个字节流成为字符流, 使得字节流以字符读取并编码
- 每次
read()
会触发一个或多个字节的读取操作. 为了更有效的将字节转化成字符, 有时会预读一些字节
FileReader
特点:
- 读取文本文件的类
- 其构造函数假设默认的字符编码和默认字节缓冲区大小是合适的
- 若不合适, 需要用
FileInputStream
实力构造一个InputStreamReader
对象,然后将这个对象传到其Reader
构造函数.
FilterReader
特点: 抽象类, 用来读取Filtered
字符流
PushbackReader
特点: 允许往字符流末尾添加一个或者多个字符
PipedReader
特点: 从管道PipedWriter
中读取字符
StringReader
特点: 从String
中读取字符
Writer
特点: 写入字符流的抽象类
BufferedWriter
特点:
- 向字符输出流中写入文本, 为字符, 字符数组, 字符串提供缓冲以便更加有效的写入
- 缓冲区默认大小是8192(8KB)
newLine()
会往输出流中写入一个line.separator
- 建议任何字符流的
Writer
都被BufferedWriter
所装饰. 否则每个writer()
操作都会调用底层write()
的操作
CharArrayWriter
特点:
- 将内存中的一个字符缓冲区当做
Writer
使用 - 当数据往流中写入时, 字符缓冲区大小会自动增长
- 数据可以通过
toCharArray()
或者toString()
直接获取到 close()
方法没有什么作用. 即使调用了close()
后, 再调用其他方法, 也不会产生异常
OutputStreamWriter
特点:
- 用来将字符流桥接到一个字节流
- 每次调用
write()
方法, 都会导致对字符的编码, 编码后的字节流一直在 buffer 中累计, 在调用底层字节流的write()
方法时写入 - 应该与
BufferedWriter
连用
FileWriter
特点:
- 读取文本文件的类
- 其构造函数假设默认的字符编码和默认字节缓冲区大小是合适的
- 若不合适, 需要用
FileOutputStream
实力构造一个OutputStreamWriter
对象,然后将这个对象传到其Writer
构造函数.
FilterWriter
特点: 抽象类, 用来写入Filtered
字符流
PipedWriter
特点: 向管道写入字符流
PrintWriter
特点:
PrintWriter
用来格式化对象并输出到字符流中PrintWriter
包含了很多类型的写出方法, 但是不包括原始byte
类型- 不像
PrintStream
, 即使打开了 automatic flushing , 方法println
,printf
或者format
方法调用后才会 flush.
StringWriter
特点: 往StringBuffer
中写入数据
其他
FAQ
问: Externalizable
和 Serializable
的区别是什么?
答: 由于Serializable
是一个标志接口. 使用Serializable
不需要实现任何方法, Java runtime 会使用反射来 marshal 和 unmarshal 对象.
在Java 旧版本中, 反射非常慢, 所以 serializing 大对象会有一定的性能问题. 为了解决这个问题, Java 提供了 Externalizable
接口让开发人员自定义 marshal 和 unmarshal 方法.
在 Java 1.3 后, 反射的性能得到了大幅度提升. 现在很少有场景需要 Externalizable
.
时间: 2024-10-09 16:34:05