1.做java开发有一段时间了,对java的io类库总是没有较全面的了解,仅仅停留在会使用几个常用api的基础 上。抽空学习了一下,对io类库有了更全面的了解。
2.IO:输入输出,java中使用流的抽象概念来表示。
3.从操作的基本单元的类型划分:可分为面向字节操作的IO和面向字符操作的IO。
3.1.在面向字节操作的IO中,api的设计者认为有关输入的类都继承自InputStream,有关输出的类都继 承自OutputStream。
InputStream又按不同的数据源产生输入划分为不同的类,主要有:
ByteArrayInputStream | 缓冲字节数组当作inputStream |
FileInputStream | 文件当作inputStream |
PipedInputStream | 用于写入PipedOutputStream的数据 |
SequenceInputStream | 将多个InputStream进行逻辑串联成单一的inputStream |
StringBufferedInputStream | String转成inputStream(jdk1.1开始不建议使用) |
FilterInputStream | 此为装饰器的抽象类 |
对应的OutputStream的主要类有:
ByteArrayOutputStream | 缓冲字节数组当作OutputStream |
FileOutputStream | 文件当作OutputStream |
PipedOutputStream | 用于写出到PipedinputStream的数据 |
FilterOutputStream | 此为装饰器的抽象类 |
3.2.关于FilterOutputStream/FilterInputStream两个抽象类的作用,java设计者采用装饰器模式来实现不 同功 能的组合,而装饰器模式必须具有和其所装饰的对象相同的接口,先看看两个装饰器有哪些具 体装饰功能类
FilterInputStream
DataInputStream | 可以读取不同基本类型数据以及String对象 |
BufferedInputStream | 对数据进行缓冲读取 |
PushbackInputStream | 具有”推回”一个字节的功能 |
CheckInputStream | 可对读取数据校验 |
InflaterInputSream | 具有对输入数据解压缩功能 |
DeflaterInputSteam | 具有对输入数据压缩数据功能 |
FilterOutputStream
DataOutputStream | 可以写出不同基本类型数据以及String对象 |
BufferedOutputStream | 对数据进行缓冲写出 |
PrintStream | 格式化输出(能够方便地打印各种数据值表示形式,指定字符编码,提供两项其他输出流同的功能:1.永远不会抛出 IOException,异常情况仅设置可通过 checkError 方法测试的内部标志;2.自动刷新--自动调用 flush 方法println 方法,写入一个换行符) |
CheckOutputStream | 可对写出数据校验 |
InflaterOutputSream | 具有对输出数据解压缩数据功能 |
DeflaterOutputSteam | 具有对输出数据压缩数据功能 |
3.3.我可以对InputStream和OutputSream进行功能的组合操作,如对数据缓冲再格式化输出。
4.JDK又为我们提供另一种形式的IO操作----面向字符的IO操作,think in java的作者说面向字符形式的IO 提供兼容Unicode的功能,主要是为了国际化,且比面向字节形式IO要更快。同样,api的设计者认为 有关输入的类都继承自Reader,有关输出的类都继承自Writer。
按不同的数据源产生划分
Reader
BufferedReader | 缓冲字符数组当作Reader(与InputStream的不同,此类直 接继承Reader类) |
CharArrayReader | 缓冲字符数组当作Reader |
PipedReader | 传送的字符输入流 |
StringReader | 字符串的读取 |
InputStreamReader | 此为适配器类(是字节流通向字符流的桥梁,使用指定的 charset 读取字节并将其解码为字符) |
FilterReader | 此为装饰器的抽象类 |
Writer
BufferedWriter | 缓冲字符数组当作Writer |
CharArrayWriter | 缓冲字符数组当作Writer |
PipedWriter | 传送的字符输出流 |
StringWriter | 字符串的写出 |
PrintWriter | 向文本输出流打印对象的格式化表示形式 |
OutputStreamWriter | 此为适配器类(是字节流通向字符流的桥梁,使用指定的 charset 读取字节并将其解码为字符) |
FilterWriter | 此为装饰器的抽象类 |
4.1.上图看出Reader,Writer与InputStream,OutputStream在类的组织结构上大致相似,但不完全相同。
4.2.关于在字符流体系中将文件流(FileReader/FileWriter)作为适配器的子类来实现。
5.最后附上一张从网上下的结构图
6.文章参考thinking in java。