IO技术在Java上是非常常见的,今天来梳理一下IO方面的知识。
在很长的一段时间里面,我也很困惑,IO里面一大堆,又是InputStream,outputStream 的,然后又是Writer 和 Reader ,仔细一看,唉。有些还带有Buffer的。本来晕头转向的,现在彻底找不到北了。
首先,先来个分类。分类都一样,按两大类分:
按照流向分是输入流和输出流,
按照处理单位分为字节流和字符流
下面来看看这张图:
图不是我画的,是别人那里复制粘贴过来的,哈哈。这里粘贴的,在此谢谢了!
首先要搞清楚一点的是:
输入流和输出流,什么时候用输入流,什么时候用输出流。所谓的输入输出是相对于程序(内存)来说的,如果是从外面(硬盘)读取数据,那么就用输入流,如果要往外面写出数据,那么就用输出流。就这么简单,不要再迷糊了。
下面来看字节流和字符流:
从上面那张图可以看到,字节流都是 InputStream 和 OutputStream 结尾的,而字符流是 Writer 和 Reader 结尾的,这就很好区分了嘛,一看就知道什么是字节流,什么是字符流。好了,搞清楚这个就看下一个问题,什么时候该用字节流,什么时候该用字符流?
记住,凡是操作文本文件,注意,是文本文件,那么就用字符流。例如:txt记事本文件
凡是操作的是非文本文件,那么就用字节流,例如:图片,音频,视频。word文档等
前面不是说文本文件都用字符流去操作么,怎么word是用字节流了呢?这不扯淡么?别,这不是扯淡,word是不是也可以插入图片等,对吧,前面不是说图片是用字节流去操作的么。对吧,还有一点就是word是经过加密了的,只有word软件才能打开,其他软件都不行,对吧,这就对了嘛。所以,word也是用字节流去操作。
字节流和字符流都搞清楚了,咦,图上面不是还有 buffer 的么?这又是什么鬼,唉。名字上不是很清楚了么,人家是带了个Buffer 缓冲数组的啊,然后就没其他了。
不过还有一点很重要的是;凡是带有Buffer的,都不具备操作文件的能力,也就是说,它本身是不能去读取和写入东西的,没事可以看看这些buffer的构造方法,带有Buffer的构造方法里面,一般都需要你传入一些inputStream或者outStream,对了,顺便再说一句,虽然不具备读写文件能力,但人家也有close的方法,这是为什么呢?还有为什么,没为什么,你不是传进去一个么?其实关闭的就是你传进去的这个。所以说,close buffer之后,就不需要对传进去的进行关闭了,没意义的!
好了,什么基础的理论知识先讲到这里,下面开始学习!代码是最好的老师嘛,对吧,不管什么都要实践一下,
FileInputStream和FileOutputStream的简单使用
Java_IO_BufferedIntputStream_And_BufferedOutputStream
Java_IO_ObjectInputStream_And_ObjectOutputStream
Java_IO_字节流_Reader_and_Writer
Java_IO_SequenceInputStream文件的合并
(后续更新。。。)