java.io
源码阅读建议
- 先看每个类的构造函数
- 再看每个类的 read/write 方法
- 看后应该发现相同前缀的不同流具有相似的特点
InputStream(返回 byte 的 ASCII 编码)
* 子类命名特点:(*)InputStream
Class | Comment |
---|---|
已过时,从给定字符串中读取字节 | |
ByteArray | 从给定的 byte[] 数组中读取字节 |
File | 从给定 File 对象中读取字节(借助 native read0() readBytes() 方法) |
Filter | protected 构造函数,专门用于包装其它 InputStream,不可被外界实例话,仅供子类实现 |
已过时,继承自 Filter,在读取可以跟踪当前字节所在行号 | |
Pushback | 继承自 Filter,可以取消读取,当调用 int b=read() 后再调用 unread(b),实现回退(缓存)操作,下次再调用 read() 既可以从上次回退(缓存)中读取 b,提升读性能 |
Buffered | 继承自 Filter,在第一次读取时就读取一个固定长度的字节的放到缓存段,以后每次读取时都从这个缓存段里读取,如果要读取的位置不在缓存段里,则重新读取此位置开始的固定长度的字节放到缓存段并返回 |
Piped | 管道输入流,与管道输出流合用,用于线程间通信,必须在不同线程;读写核心都在管道输入流,一个线程通过管道输出流写出数据到管道输入流,另一个线程通过管道输入流读取 |
Sequence | 包装持有多个 InputStream 实例的逻辑串联,依序读取多个输入流 |
Data | 继承自 Filter,提供将读取到字节直接转化为 Java 基本数据类的各种便捷方法 |
Object | 包装持有其它 InputStream 实例,对以前使用 ObjectOutputStream 写出的 Java 基本数据和对象进行读入(反序列化) |
plantUml
@startuml
interface Closeable
interface DataInput
interface ObjectInput
interface ObjectStreamConstants
DataInput <|-- ObjectInput
abstract class InputStream
Closeable <|.. InputStream
InputStream <|-- ByteArrayInputStream
InputStream <|-- FileInputStream
InputStream <|-- FilterInputStream
InputStream <|-- BufferedInputStream
DataInput <|.. DataInputStream
FilterInputStream <|-- DataInputStream
FilterInputStream <|-- LineNumberInputStream
FilterInputStream <|-- PushbackInputStream
ObjectInput <|.. ObjectInputStream
ObjectStreamConstants <|.. ObjectInputStream
InputStream <|-- ObjectInputStream
InputStream <|-- PipedInputStream
InputStream <|-- SequenceInputStream
InputStream <|-- StringBufferInputStream
@enduml
OutputStream
* 子类命名特点:(*)OutputStream + PrintStream
Class | Comment |
---|---|
Filter | 专门用于包装其它 OutputStream,与 FilterInputStream 不同,可被外部实例化 |
Buffered | 继承自 Filter,内置 buffer[] 数组,当每次 write 时,只是简单的设置到 buffer,当 write 之前如果 buffer 满了才一次性调用持有的 OutputStream 实例 flushBuffer(数组) |
Data | 继承自 Filter,提供将写出 Java 基本数据类型和图形的各种便捷方法 |
PrintStream | 继承自 Filter,提供了写出 Java 基本数据类型、字符串、char[] 等各种方便方法,默认每次写出一个字节不会立即 flush() |
Piped | 管道输出流,与管道输入流合用,用于线程间通信,必须在不同线程;读写核心都在管道输入流,一个线程通过管道输出流写出数据到管道输入流,另一个线程通过管道输入流读取 |
ByteArray | 将字节写出到一个 byte[],此 byte[] 会在写出时根据需要自动增长,目的就是通过 toByteArray() 和 toString() 获取最终写出数据 |
File | 将字节写出到一个文件(借助 native write() writeBytes() 方法) |
Object | 包装持有其它 OutputStream 实例,提供将 Java 基本数据和图形进行写出(序列化) |
plantUml
@startuml
interface Closeable
interface Flushable
interface DataOutput
interface Appendable
interface ObjectOutput
interface ObjectStreamConstants
DataOutput <|-- ObjectOutput
abstract class OutputStream
Closeable <|.. OutputStream
Flushable <|.. OutputStream
OutputStream <|-- ByteArrayOutputStream
OutputStream <|-- FileOutputStream
OutputStream <|-- FilterOutputStream
FilterOutputStream <|-- BufferedOutputStream
DataOutput <|.. DataOutputStream
FilterOutputStream <|-- DataOutputStream
Appendable <|.. PrintStream
FilterOutputStream <|-- PrintStream
ObjectOutput <|.. ObjectOutputStream
ObjectStreamConstants <|.. ObjectOutputStream
OutputStream <|-- ObjectOutputStream
OutputStream <|-- PipedOutputStream
@enduml
Reader(返回 char 的字符编码)
* 子类命名特点:(*)Reader
Class | Comment |
---|---|
Filter | protected 构造函数,专门用于包装其它 Reader,不可被外界实例化,仅供子类实现 |
Pushback | 继承自 Filter,可以取消读取,当调用 int c=read() 后再调用 unread(c),实现回退(缓存)操作,下次再调用 read() 既可以从上次回退(缓存)中读取 c,提升读性能 |
Buffered | 专门包装其它 Reader,与 Filter 不同可以被外界实例化;在第一次读取时就读取一个固定长度的字符的放到缓存段(char []),以后每次读取时都从这个缓存段里读取,如果要读取的位置不在缓存段里,则重新读取此位置开始的固定长度的字节放到缓存段并返回;同时提供一个方便读取一整行数据的方法 |
LineNumber | 继承自 Buffered,在读取时可以跟踪当前字符所在行号,注意提供的设置行号的方法并不一定是下次读取的字符所在的行号 |
CharArray | 从给定的 char[] 数组中读取字符 |
InputStream | 从给定的 InputStream(字节流)中读取字符 |
File | 继承自 InputStream,仅定义了 3 个构造方法,借助父类构造方法方便从给定的 String、File、FileDescriptor 中读取字符 |
Piped | 管道输入字符流,与管道输出字符流合用,用于线程间通信,必须在不同线程;读写核心都在管道输入字符流,一个线程通过管道输出字符流写出数据到管道输入字符流,另一个线程通过管道输入字符流读取 |
String | 从给定的 String 中读取字符 |
plantUml
@startuml
interface Closeable
interface Readable
abstract class Reader
Closeable <|.. Reader
Readable <|.. Reader
abstract class FilterReader
Reader <|-- BufferedReader
BufferedReader <|-- LineNumberReader
Reader <|-- CharArrayReader
Reader <|-- FilterReader
FilterReader <|-- PushbackReader
Reader <|-- InputStreamReader
InputStreamReader <|-- FileReader
Reader <|-- PipedReader
Reader <|-- StringReader
@enduml
Writer
* 子类命名特点:(*)Writer
Class | Comment |
---|---|
Filter | protected 构造函数,专门用于包装其它 Reader,不可被外界实例化,仅供子类实现 |
Buffered | 专门包装其它 Writer,与 Filter 不同可以被外界实例化;内置 (char)cb[] 数组,当每次 write 时,只是简单的设置到 cb,当 write 之前如果 cb 满了才一次性调用持有的 Writer 实例 flushBuffer(数组);提供 newLine() 方法实现了平台相关的换行符插入 |
CharArray | 将字符写出到一个 char[],此 char[] 会在写出时根据需要自动增长,目的就是通过 toCharArray() 和 toString() 获取最终写出数据 |
OutputStream | 用给定的 OutputStream(字节流)中写出字符 |
File | 继承自 OutputStream,仅定义了 5 个构造方法,借助父类构造方法方便从给定的 String、File、FileDescriptor 中写出字符 |
Piped | 管道输出字符流,与管道输入字符流合用,用于线程间通信,必须在不同线程;读写核心都在管道输入字符流,一个线程通过管道输出字符流写出数据到管道输入字符流,另一个线程通过管道输入字符流读取 |
提供了写出 Java 基本数据类型、字符串、char[] 等各种方便方法,默认每次写出一个字节不会立即 flush() | |
String | 内部持有 StringBuffer 实例,用于构造字符串:toString() |
plantUml
@startuml
interface Closeable
interface Flushable
interface Appendable
abstract class Writer
Closeable <|.. Writer
Flushable <|.. Writer
Appendable <|.. Writer
abstract class FilterWriter
Writer <|-- BufferedWriter
Writer <|-- CharArrayWriter
Writer <|-- FilterWriter
Writer <|-- OutputStreamWriter
OutputStreamWriter <|-- FileWriter
Writer <|-- PipedWriter
Writer <|-- PrintWriter
Writer <|-- StringWriter
@enduml
Other
plantUml
@startuml
interface Closeable
interface Flushable
interface Serializable
interface Externalizable
interface FileFilter
interface FilenameFilter
interface ObjectInputValidation
interface ObjectStreamConstants
interface DataOutput
interface DataInput
Serializable <|-- Externalizable
Serializable <|.. File
Serializable <|.. FilePermission
Serializable <|.. ObjectStreamClass
Serializable <|.. SerializablePermission
Flushable <|.. Console
Closeable <|.. RandomAccessFile
DataOutput <|.. RandomAccessFile
DataInput <|.. RandomAccessFile
class Bits
class FileDescriptor
class ObjectStreamField
class StreamTokenizer
class DefaultFileSystem #PaleGreen
class DeleteOnExitHook #PaleGreen
class ExpiringCache #PaleGreen
abstract class FileSystem #PaleGreen
class UnixFileSystem #PaleGreen
FileSystem <|-- UnixFileSystem
class SerialCallbackContext #PaleGreen
@enduml
Exception
plantUml
@startuml
Error <|-- IOError
class UncheckedIOException
IOException <|-- CharConversionException
IOException <|-- EOFException
IOException <|-- FileNotFoundException
IOException <|-- InterruptedIOException
IOException <|-- ObjectStreamException
IOException <|-- SyncFailedException
IOException <|-- UnsupportedEncodingException
IOException <|-- UTFDataFormatException
abstract class ObjectStreamException
ObjectStreamException <|-- InvalidClassException
ObjectStreamException <|-- InvalidObjectException
ObjectStreamException <|-- NotActiveException
ObjectStreamException <|-- NotSerializableException
ObjectStreamException <|-- OptionalDataException
ObjectStreamException <|-- StreamCorruptedException
ObjectStreamException <|-- WriteAbortedException
@enduml