Java 基础 - 基本 IO
基本 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.

浙公网安备 33010602011771号