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

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)。
装饰类与被装饰类都属于同一个体系。
同时装饰类中持有被装饰类的引用。



你可能感兴趣的:(java,字符流,编码,IO流,缓冲区)