IO(过滤器流)

来源:互联网 发布:全站仪数据采集的步骤 编辑:程序博客网 时间:2024/04/27 20:41

意义:在基本的输入和输出流中,我们都是和字节打交道,但是在java类库中有些我们常用的格式来应付我们日常的工作,对于我这样的少年来说,都学不完啊,例如FTP传输文件的格式为zip格式。

过滤器流有两个版本:过滤器(处理字节,例如压缩和缓冲这些)和阅读/书写器(主要是使用编码格式处理文本)。这里我重点复习过滤器。

实例:

一。缓冲流(BufferedOutputStream和BufferedInputStream)

主要作用就是缓冲。

方法:每个过滤器输出流都和OutputStream相同的write(),close(),flush()方法(继承复习父亲方法的缘故)。每个过滤器输入流都和InputStream相同的read(),close()方法。

一般用法:通过构造方法和底层流链接--如上面的箭头。例如缓冲文件的输入:

InputStream filein = new FileInputStream("1.txt");BufferedInputStream bfilein = BufferedInputStream (filein );

因为前面说过,过滤器也有像底层流的read/write/flush等方法(因为查看源码就可以知道BufferedInputStream间接继承了FilterInputStream,完全是内部是实现!),所以按照一般规则,构造好过滤器后,以后就可以使用这个链最后一个过滤器来对字节操作,而不是用底层流的方法了(FileInputStream),这样你就不会对底层流进行读写操作,从而不会破坏缓冲区。

具体缓冲流:

BufferedOutputStream--将数据缓冲在缓冲区(一个字节数组)中,知道缓冲区满或者刷出流,然后一次性写入底层流(见上图)。可见,对于网络传输的较大代价,一次写入很多数据比多次写入少量数据开销更小。

实例:

public class FileOutputStreamTest { public static void main(String[] args) {    InputStream fileInputStream = null;try {File file = new File("save.txt");fileInputStream = new BufferedInputStream(new FileInputStream(file));int x ;while(( x = fileInputStream.read())!= -1){System.out.print((char)x);}} catch (IOException e) {e.printStackTrace();}finally{if(fileInputStream!=null){try{fileInputStream.close();} catch (IOException e) {e.printStackTrace();}}}}}

BufferedOutputStream--也有一个字节数组最为缓冲区,当调用read()方法时,会请求缓冲区获得字节,只用当缓冲区(字节数组)没有字节了,才会从底层流(FileInputStream)读取字节,这是它就会尽量读取,不管你是否立即需要缓冲区中的字节。以为从磁盘读取字节,一个字节和一百字节几乎没有书读差距,所以缓冲区可以明显提升性能,明显来开对于网络不明显,因为巨大的报文段开销,例如额外的求和字节,网速等等。

实例:省略。

构造方法:BufferedOutputStream和BufferedOutputStream的构造方法差不多,以BufferedOutputStream代表复习一下

BufferedOutputStream(InputStream in):常用。

BufferedOutputStream(InputStream in, int bufferSize):指定缓冲区数组大小,默认为2048。

其他方法:

BufferedInputStream和BufferedOutputStream一样都是覆盖了原始流的方法(InputStream/OutputStream),没有新的方法,可以比喻为先进的可以缓冲字节的原始流,其中BufferedInputStream的有两个可以读取多个字节的read()方法,从而将底层流读取的字节尽量放进缓冲区,只有三种情况read()返回读取到的字节数:1。读完了2。数组填满3。底层流阻塞。

BufferedOutputStream的特殊在于,他是把你要“寄”出去的数据缓存起来,他也只有在缓冲区的数据慢时才“寄”出去,但是像我这样的小弟哪有那么多的数据要发啊,此时使用flush()方法把缓冲区还不愿意发出去的“小"数据刷出去才行。

二。数据流(DataInputStream和DataOutputStream)

主要作用就是数据格式的方面了。


他就是把相应的数据格式读取为二进制自己在中间中间介质中传输,

方法:略。

当然由于继承的原因,DataOutputStream也有write(),close(),flush()方法。DataInputStream也有read(),close()方法。

实例:

public class DataOutputStreamTest { public static void main(String[] args) { DataOutputStream out = null; //使用OutputStream的话就无法使用writeChars,因为这是新方法 //OutputStream fileOutputStream = null;try {File file = new File("save.txt");out =new  DataOutputStream(new BufferedOutputStream(new FileOutputStream(file)));String yuege = "yuege";//byte[] yuegeByte = yuege.getBytes();out.writeBytes(yuege);} catch (IOException e) {e.printStackTrace();}finally{if(out!=null){try{out.close();} catch (IOException e) {e.printStackTrace();}}}}}


0 0
原创粉丝点击