Java IO包里的东西虽然多,但是其实不乱,参考JDK的文档和网上的一些资源,整理了下思维导图,只包括了IO包中的,其余包中的扩展暂且忽略吧,真心太多了=。=顺便对IO包里如此众多的玩意儿总结下。
在IO包中面向字节序列读写的是InputStream,OutputStream,面向字符的是Reader,Writer。其原因是面向字节的流不便于处理Unicode形式的信息(虽然说如果一定希望使用字节流来处理字符也是完全可行的),所以引出了Reader和Writer构成了一个单独的层次用来对基于字节的Unicode码元进行操作。
流的概念
流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。
字符流与字节流的区别
字符流的由来: 因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。
(1)读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
(2)处理对象不同:字节流能处理所有类型的数据(如图片、视频、音频等),而字符流只能处理字符类型的数据。
(3)字节流在操作的时候本身是不会用到缓冲区的,是文件本身的直接操作的;而字符流在操作的时候下后是会用到缓冲区的,是通过缓冲区来操作文件。
结论:优先选用字节流。首先因为硬盘上的所有文件都是以字节的形式进行传输或者保存的,包括图片等内容。但是字符只是在内存中才会形成的,所以在开发中,字节流使用广泛。
IO流对象
InputStream:InputStream是抽象类,且是所有字节输入流类的超类。InputStream的子类必须提供返回下一个输入字节的方法。
Original Stream:ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。PipedInputStream 是从与其它线程共用的管道中读取数据,与包装流相区分将这些流称为原始流。