您的位置:首页 > 编程语言 > Java开发

java提高篇(一) java知识汇总-------io流知识汇总(io学习流程)

2014-08-04 21:31 323 查看
io流:

io:用于处理设备上的数据的技术,设备:内存,硬盘,光盘。

流:系统资源,windows系统本身就可以操作设备,各种语言只是使用系统平台上的这个资源

并对外提供了各种语言自己的操作功能,这些功能最终调用的是系统资源。

使用完资源一定要记住:释放。

io流:java中所涉及的功能对象都存储到java.io包中。

设备上数据最常见的存储表现形式就是文件(file)

先学习一下文件的基本操作。

描述文件或者文件夹的类是File类。

IO流的学习流程

1,先学习了File:IO技术用于操作设备上的数据,而数据最常见的体现方式是文件。

先了解文件的操作:

创建,删除,存在,隐藏,获取。。。。

2,需求:怎么操作文件的数据呢?

使用IO流对象,而且文件数据都是以字节的形式存在的。

3,为了满足需求,进而学习了可以操作文件字节流的方法。

InputStream

|---FileInputStream

OutputStream

|---FileOutputStream

4,为了提高操作字节流的效率,引入了缓冲区对象。

InputStream

|---FileInputStream

|---FilterInputStream

|---BuffferedInputStream(缓冲区)

OutputStream

|---FileOutputStream

|---FilterOutputStream

|---BuffferedOutputStream

5,发现,文件数据,媒体文件用字节操作没问题。

但是对于文本文件,想要操作文本中的中文数据时,字节流只能操作字节,需要我们编码并把字节解码成字符。有点麻烦。

所以就到API中找对象,就发现字符流中有字节和字符的桥梁。(也就是传说中的转换流)

Reader

|--InputStreamReader:字节-->字符(解码)

Writer

|--OutputStreamWriter:字符-->字节(编码)

这种方式解决了中文编码转换的问题。

6,为了便捷操作字符文件,找到了转换流的子类,但是它有局限性,只能操作文本文件,而且使用的是默认编码表。

如果不操作其他类型的文件,而且编码不是默认的,就需要用到转换流(字节流)

Reader

|--InputStreamReader:字节-->字符(解码)

|--FileReader

Writer

|--OutputStreamWriter:字符-->字节(编码)

|--FileWriter

7,为了提高字符流的操作效率,引入字符串的缓冲区。

Reader

|--InputStreamReader:字节-->字符(解码)

|--FileReader

|--BufferedReader

Writer

|--OutputStreamWriter:字符-->字节(编码)

|--FileWriter

|--BufferedWriter

8,字节流和字符流都用到了缓冲区,那么缓冲区的原理是什么呢?

缓冲区原理:

临时存储数据的方法,减少对设备操作的频率,提高了效率,其实就是将数据临时缓存到了内存(数组)中。

9,IO中的装饰设计模式

Writer

|--TextWriter

|--MediaWriter

在对数据写入操作过程中,希望提升效率。

要对操作文本的对象提升效率,使用缓冲区技术。

Writer

|--TextWriter

|--BufferedTextWriter

|--MediaWriter

|--BufferedMediaWriter

|--AudioWriter

|--BufferedAudioWriter

这样的体系,为了增加一些功能,而通过产生子类来完成,会导致继承体系变得很臃肿,因为会产生很多子类。

重新思考体系的设计问题,都是在写的方法上进行效率的提升。

为什么不讲该功能进行单独的封装呢?要提升那个具体对象的效率,就将要提升的那个对象交给这个单独功能就可以了。

class BufferedWriter extends Writer{//BufferedWriter虽然可以提高Writer体系中对象的效率,单它还是体系中的一员。

/*

BufferedWriter(TextWriter t){}//要提升写文本的效率就把文本对象传给BufferedWriter

BufferedWriter(MediaWriter m){}

......//如果后面还有音频对象要被提升效率这样就要构造更多的函数,这样拓展性也不好。

*/

//上面的方式操作具体类型有些繁琐,那么我们可以操作这些对象的共性类型。

//不管后来传入什么样的子类对象,只要操作体系中的父类,就可以不用管后面传入何种对象。如下。

BufferedWriter(Writer w){}

}

这样体系就简化成

Writer

|--TextWriter

|--MediaWriter

|--AudioWriter

|--BufferedWriter

TextWriter tw=new TextWriter();

tw.write();//这是通常的写的方式,但是要想提升效率可以用下面的方式。

TextWriter tw=new TextWriter();

BufferedWriter bufw=new BufferedWriter(tw);

bufw.write();//这样被装饰完以后,写的效率就可以提升。

这种方式可以给对象提供额外的功能(职责)。比继承更为灵活。

给这种方式起个名字就叫做装饰设计模式(wrapper或者 Decorator)。

装饰类与被装饰类都属于同一个体系。

同时装饰类中持有被装饰类的引用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: