Java IO 全攻略--之二

3.4 字节流与字符流

       从上面我们可以看出IO中的字节流是极其复杂的,存在大量的类,到目前为止还没有真正使用它们,使用它们应该也是极其复杂的吧!JDK1.1SunIO库进行了重大的改进。看到ReaderWriter类时,大多数人的第一个感觉(不要太相信感觉哦!感觉也许会欺骗你的!)就是它们是用来替换原来的InputStreamOutputStream类。有新的类,干吗还使用旧的呢!?但实情并非如此。尽管Sun不建议使用原始的流库中的某些功能,但原来的流依然得到了保留,不仅为了保持向后兼容,主要原因是新库不是旧库的替代,而是对旧库的增强。从以下两点可以明显地看出:

(1) 在老式的类层次结构里加入了新的类,这表明 Sun公司没有放弃老式流库的意图。

(2) 在许多情况下,新库中类的使用需要联合老结构中的类。为达到这个目的,需要使用一些“桥”类,如:InputStreamReader将一个InputStream转换成ReaderOutputStreamWriter将一个OutputStream转换成Writer

那么Sun为什么在Java 1.1里添加了ReaderWriter层次,最重要的原因便是国际化(Internationalization――i18n)的需求。老式IO流层次结构只支持8位字节流,不能很好地控制16位的Unicode字符。Java本身支持UnicodeSun又一致吹嘘其支持Unicode,因此有必要实现一个支持Unicode的流的层次结构,所以出现了ReaderWriter层次,以提供对所有IO操作中的Unicode的支持。除此之外,新库也对速度进行了优化,可比旧库更快地运行。

8位的字节流和16位的字符流的对应关系,可以从ByteInputStream/ByteOutputStreamCharArrayInputStream/CharArrayOutputStream的对应关系中看出端倪。(还没看出来啊!赶紧去看看Java的基本数据类型)。

因此在JavaIO体系中存在字节流和字符流的对应关系。下面就看看字符流吧!

3.5 IO中的输入字符流

       下面是IO中输入字符流的继承图。

    • Reader
      • BufferedReader
        • LineNumberReader
      • CharArrayReader
      • FilterReader
        • PushbackReader
      • InputStreamReader
        • FileReader
      • PipedReader
      • StringReader

在上面的关系图中可以看出:1.Reader是所有的输入字符流的父类,它是一个抽象类。2.CharReaderStringReader是两种基本的介质流,它们分别将Char数组、String中读取数据。PipedReader是从与其它线程共用的管道中读取数据。3. BufferedReader很明显就是一个装饰器,它和其子类负责装饰其它Reader对象。4.FilterReader是所有自定义具体装饰流的父类,其子类PushbackReaderReader对象进行装饰,会增加一个行号。5.InputStreamReader是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream转变为Reader的方法。我们可以从这个类中得到一定的技巧。

       Reader中各个类的用途和使用方法基本和InputStream中的类使用一致。后面会有ReaderInputStream的对应关系。

3.6 IO中的输出字符流

下面是IO中输出字符流的继承图。

    • Writer
      • BufferedWriter
      • CharArrayWriter
      • FilterWriter
      • OutputStreamWriter
        • FileWriter
      • PipedWriter
      • PrintWriter
      • StringWriter

在上面的关系图中可以看出:1.Writer是所有的输出字符流的父类,它是一个抽象类。2. CharArrayWriterStringWriter是两种基本的介质流,它们分别向Char数组、String中写入数据。PipedWriter是向与其它线程共用的管道中写入数据, 3. BufferedWriter是一个装饰器为Writer提供缓冲功能。4.PrintWriterPrintStream极其类似,功能和使用也非常相似。5.OutputStreamWriterOutputStreamWriter转换的桥梁,它的子类FileWriter其实就是一个实现此功能的具体类(具体可以研究一下Source Code)。功能和使用和OutputStream极其类似,后面会有它们的对应图。

3.7字符流的输入与输出的对应

下图为字符流的输入与输出的对应关系图:

 【引用】Java IO 全攻略--之二 - Hunter - 一生有你

 

       对应关系和字节流的输入输出基本一致,不必多说了吧!在下面的源代码阅读部分会仔细研究一些!

3.8字节流和字符流的对应

       JavaIO中存在输入、输出的对应和字节流和字符流的对应,下面就看看字节流和字符流的对应吧!

3.8.1输入的对应

       下图是IO中字节输入流与字符输入流的对应图:

 【引用】Java IO 全攻略--之二 - Hunter - 一生有你

 

       蓝色的表示对应的部分,红色的表示不对应的部分。至于为什么不对应还是你自己多看看源代码、多考虑考虑吧!还要强调一点就是即使对应,它们的继承关系也是不太对应的。

 

3.8.2输出的对应

下图是IO中字节输出流与字符输出流的对应图:

 【引用】Java IO 全攻略--之二 - Hunter - 一生有你

 

       不多说了!等讲述了AdapterDecorator模式会基本明白IO架构的!通过几个实例一般就可以使用了!

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值