好久不用Java的IO流,把好多的基础知识都忘了,昨天在写一段代码,发现好多细节都忘了。那天在组织组内代码评审的时候,发现有人在乱用IO流相关的类,所以还是写篇文章,把这个知识点总结一下。
对于Java这种庞大的体系,我们要学某一块知识点,只有从整体上把握,整体上形成一个知识架构,这样才能更好的把握学习内容和学习方向。所以呢,和别的博文一样,上来就先来一张别的博客贴来的类结构图。
大家先不要被这张图中那么多的类所迷惑了;其实,从这张图来看,结构还是非常清晰的,也是非常简单的。虽然类很多,但是我们常用的也就那么几个,熟悉了整个的调用流程,我们就可以玩的很开心的。下面,我把我们常用的那几个整理出来,如下图所示:
从我们经常使用的角度来说,IO流分为字符流和字节流,下面就分别从字符流和字节流展开说明和总结。
字节流是指在传输过程中,传输数据的最基本单位是字节的流。
字节输入流
字节输入流的的抽象基类是 InputStream
,我们最常用的子类是 FileInputStream
和 BufferedInputStream
这两个类。
FileInputStream
被称为文件字节输入流,意思指对文件数据以字节的形式进行读取操作,如读取图片视频等;这种我们经常在读取文件时会用到。
BufferedInputStream
是字节输入缓冲流,在 BufferedInputStream
的使用过程中,会经常结合一些其它的流一起使用,比如我们看 BufferedInputStream
的构造函数:
BufferedInputStream(InputStream in)
BufferedInputStream
本质上是通过一个内部缓冲区数组实现的。例如,在新建某输入流对应的 BufferedInputStream
后,当我们通过 read()
读取输入流的数据时, BufferedInputStream
会将该输入流的数据分批的填入到缓冲区中。每当缓冲区中的数据被读完之后,输入流会再次填充数据缓冲区;如此反复,直到我们读完输入流数据位置。通过 BufferedInputStream
,我们可以提高字节流的读取和处理速度。
字节输出流
字节输出流的抽象基类是 OutputStream
,我们最常用的子类是 FileOutputStream
和 BufferedOutputStream
这两个类。
关于字节输出流这两个常用类就不细说了,和上面的字节输入流一样。
字符流是指在传输过程中,传输数据的最基本单位是字符的流。
字符输入流
字符输入流的抽象基类是 Reader
,我们最常用的子类是 BufferedReader
和 FileReader
这两个类。用法不多说了。
字符输出流
字符输出流的抽象基类是 Writer
,我们最常用的子类是 BufferedWriter
和 FileWriter
这两个类。用法也不多说了。
为啥用法不多说呢?因为明白了整个的类结构,接下来的使用也就是API的使用,我们在使用过程中需要重点关注一下编码的问题就OK了。
一篇简单的总结,连代码示例都木有!希望对大家有那么一点点的帮助!
2019年7月28日 于内蒙古呼和浩特。