JavaIo:JavaIo输入输出流

作者: Leon_hy | 来源:发表于2015-10-08 15:14 被阅读200次

    转载至“http://segmentfault.com/a/1190000003817055?utm_source=Weibo&utm_medium=shareLink&utm_campaign=socialShare”

    流的原理:

    在这个例子里我们可以充分看出输入流创建和输入的过程,首先创建一个File对象来映射IO上的这个文件,依据这个File对象来创建输入流InputStream对象,注意,创建过后输入流里按序存储着IO文件里的数据内容(这个过程中可能InputStream并不是其存储作用的,因为若果这样大文件内的数据一次性存储可能会爆内存,所以这个过程应该是InputStream映射到IO文件),调用输入流InputStream对象的read方法,即可将流内的数据输入到程序中的之前创建的对象内,最终在使用完后关闭作为有限资源的输入流。这个过程完成了数据由IO对象输入到程序。

    注意:如果是上次没有读完输入流内的内容,那么下一次程序到InputStream去读的时候是接着上次的结尾读的,这个可以根据InputStream对象的available方法看出来,所以在这个角度来看输入流就像是文件里的索引指针一样。

    在这个例子里我们可以充分看出输出流创建和输出的过程,首先创建一个File对象来映射IO上的这个文件,依据这个File对象来创建输出流OutputStream对象,调用输出流OutputStream对象的write方法,即可将程序对象中的数据写到输出流中然后从输出流输出到IO文件中去,最终在使用完后关闭作为有限资源的输出流。这个过程完成了数据由程序输出到IO文件中。

    字符输入输出流的道理是一样的,只不过字符流是直接处理字符的,而字节流的处理单位是字节。read和write的API大同小异,无非就是把流里面的内容和缓冲区通过这些函数来进行交换。

    流的流:

    既然可以依据IO文件来创建流在文件和程序之间交换数据,那么我们可不可以从中间再加入一个流来作为中转处理一下数据呢?这个流的流构成的多流链称之为“流对象链”,这个过程说明不是所有的流都是直接和原始数据源打交道的,所以有如下定义:

    节点流(Node Stream)直接连接到数据源,直接从IO文件上输入或输出数据;

    处理流(Processing Stream)是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现增强的数 据读写功能,它并不直接连到数据源。

    这个过程的原理如下图所示:

    这里表现的是这个过程,IO文件里的数据经过文件输入流FileInputStream对象流入缓冲输入流BufferedInputStream对象,之后所有的数据(在数据量较小的时候,一般是小于8K时,后面会讨论到)流入输入流的缓冲区,之后每次在读取的时候都是直接从缓冲区读到临时的数组中去而不是再从流读入,然后临时数组的数据在write函数的作用下写到输出流的缓冲区中去,缓冲区满后数据会经由缓冲输出流BufferedOutputStream对象流入文件输出流FileOutputStream对象,并最终输出到IO文件中去,如果缓冲区不满的话是不会自发输出到缓冲输出流中去的,因此往往我们需要在最后缓冲区不满的情况下强制执行输出流的flush方法让缓冲区数据强制输出到输出流中去。这个过程完成了IO文件数据的流转,中间有一个缓冲区在暂存数据。

    在这个例子里我们可以更容易地发现BufferedReader这样的缓冲类输入流的缓冲作用,当首次调用readline(或者read等各种读取方法)函数读取这个输入流的时候,就会将流里的数据读进程序为BufferedInputStream对象分配的一个缓冲区中,而在此后的读取输入流的过程中就不需要去流中读取而只需要去缓冲区里读取就可以了,将开销较大的IO数据交换过程变成了开销小得多的内存数据交换,进而提高了IO效率,这是缓冲输入输出流的好处。但是这个缓冲区的大小是有限的,jdk为这个大小确定的固定值为8K字节,一旦超过这个值的话在第一次读取时就只能缓冲最多8K子节的数据,超出的部分只能在之后再缓冲。最后,如果要结束任务写入输出流的时候,要注意调用输出流的flush方法来将缓冲区强制清空使之全部输出到输出流中去。

    上面这个过程演示了缓冲区的大小,当输入流的内容填不满缓冲区时(也就是不足8192字节时),如果不用flush没有办法自动写入文件,当原来缓冲区的大小大于这个值的时候,会一次性把上次的8192字节自动写入,下一次会再读入8192个字节,完成上面的过程。因此,这提醒我们,使用带有缓冲的输出流时务必要在最后强制清空缓冲进入输出流才能保证数据不出错。

    相关文章

      网友评论

        本文标题:JavaIo:JavaIo输入输出流

        本文链接:https://www.haomeiwen.com/subject/bkjsqttx.html