IO流小结之二:IO流的装饰设计模式、字节流的知识点小结以及转换流的应用

时间:2022-08-10 17:09:06

       

  一、字符流和装饰设计模式

             为了提高读写效率,在IO流两个基类Writer和Reader的对应子类FileWriter和FileReader基础上,有两个装饰类BuffferedWriter   BufferedReader,通过建立缓冲区的方式提高读写效率,在通常情况下,利用buffere缓冲流已经成为最常用的方法;因为在缓冲区里封装了数组,这样不用额外定义数组,增强速度效率;而装饰流是基于基础流操作实现的,本身对硬件的操作还是通过filewriter和filereader实现的,所以缓冲区要结合流才可以使用,可以理解为是在流的基础上对流的功能进行增强;

 BufferedReader  是对FileReader 的功能增强,BufferedReader中提供了readline方法,该方法每次可以读取一行的数据存入数组中, 字符流中使用字符数组,  另外BufferReader也有一个装饰类,LineNumberReader,该类在BufferedReader功能的基础上增加了读取行号,设定行号的功能;

BuffereWriter是对FileWriter的功能增强,BuffferedWriter  类里面有一个Newline();方法是跨平台的换行符,在linuxwindows平台都是换行,默认在linux下调用\nwindows下调用\r\nBuffferedWriter 由于利用FileWriter的进行底层操作,所以还是需要刷新操作;

这其实是一种装饰设计模式。

            装饰设计模式:,当想要对已有的对象进行功能在增强时,可以定义类,将已有对象传入,基于已有的功能,并提供加强功能,那么自定义的该类称为装饰类。装饰类中需要传递被增强的对象,通常使用构造方法接收被装饰的对象,并基于被装饰的对象的功能;

           装饰和继承的区别:装饰模式比继承更灵活,避免了继承体系的臃肿,而且降低了类与类之间的关系,装饰类因为是增强已有对象,具备的功能和已有的对象是相同的,只不过提供了更强的功能,装饰类和被装饰类通常都属于同一个父类或同一个接口。

             

      

二、字节流的基本知识点

字节流的抽象基类:

InputStream OutputStream

                          字节流的两个基类子类:

FileInputStream ,FileOutputStream

 字节流的两个基类子类的装饰流:

BufferedInputStream ,BufferedOutputStream

字节流和字符流之间转换的两个转换类:

InputStreamReaderOutputStreamWriter                

                 可以简单的理解那就是带末尾带stream的就是字节流,在字节流中发送数据时不需要单独刷新,字符转字节可以用.getByte()方法;

         在字节流中使用字节数组来接收数据,在定义数组的时候可以使用FileInputStream中的available()方法来获取文件的大小,并以此来定义一个刚刚好的数组大小,这种方法在已知文件大小的,以及操作小文件的时候可以使用,但是需要慎用,因为通过available开辟的缓存数组大小如果超出系统物理内容容量,可能发生内存溢出异常;JAVA的虚拟机默认的启动内存大小为64M(可以修改设置)

三、字节流的应用

               通过字节流,我们可以对任何文件进行操作,例如音视频,图片等,字符流也可以复制这些文件,但是可能打不开,因为字符流读的时候会默认解码,把音频文件当成字符文件来解码,所以我们也就可以认为不能用字符流来复制音视频和图片文件;复制文件的时候必须加上文件的类型

              在字节流中,Read方法会自动补0,将byte字节提升为int类型,这是为了避免出现-1而误判为结束读取,而write方法,也会进行强制转换,只写int的最低8位,即最低一个字节写出去,这样就还原了数据;

       window系统下,换行符是\r\n,'\r'对应的阿斯卡编码为13,'\n'对于的阿斯克编码为10;在DOS下输入-1系统获得的是两个字节的数据,分别是-和1,需要键入停止符-1则需要用Ctrl+c,Ctrl+cdos下是结束标记,

                 System  out对应的标准输出设备,对应的是控制台,而system in对应的标准输入设备,对应的就是键盘;而System.out对应的就是PrintStream也是OutputStream输出流的一个子类,

java.lang.Object
IO流小结之二:IO流的装饰设计模式、字节流的知识点小结以及转换流的应用java.io.OutputStream
IO流小结之二:IO流的装饰设计模式、字节流的知识点小结以及转换流的应用java.io.FilterOutputStream
IO流小结之二:IO流的装饰设计模式、字节流的知识点小结以及转换流的应用java.io.PrintStream

system.in对应的则是InputStream 输入流;

                      当我们在处理键盘输入和屏幕输出的时候,会涉及到字节流和字符流之间的转换,例如当我们要从键盘获取输入的字符时,为了提高效率,需要通过Readline方法,而这个方法是字符流中的方法,为了在字节流中使用readline方法,需要将字节流转换为字符流,再使用字符流的缓冲区修饰类方法;这里就要用到转换流,在reader类中有包含这样的转换流,InputStreamReader.是字节流通向字符流的桥梁,在构造方法的时候接收一个字节流。代码如下:

                        InputStream in=System.in;//定义输入流
                InputStreamReader isr=new InputStreamReader(in);//使用转换流,将字节流转换为字符流

                        BufferedReader bfr=new BufferedReader(isr);//使用字符流中的装饰流

BufferedReader bfr=new BufferedReader(new InputStreamReader(System.in));//以上三句可以简化为一句,这也是键盘输入流操作的最常用的方法;

                       当我们需要把内容通过屏幕显示出来的时候,可以用system.out.println;也可以用一下代码,这里主要是用到了字符流转换为字节流:使用OutputStreamWriter,他是字符流通向字节流的桥梁,

                OutputStream ost=System.out;//定义输出流,构造的时候接收一个输出流(父类接收子类:PrintStream是OutputStream输出流的一个子类,
OutputStreamWriter osw=new OutputStreamWriter(ost);//使用转换流,
BufferedWriter buw=new BufferedWriter(osw);//使用装饰流,注意,传递给 write() 方法的字符没有缓冲。
BufferedWriter buw=new BufferedWriter(new OutputStreamWriter(System.out));//以上三句可以简写为此句,


四、小结

          其实IO流的基本操作都大同小异,关键在于理清关系,通常情况下我们应用的时候多用装饰流,但是对于了解装饰流的实现原理和流的基本操作是非常有必要的。