java.io包中的类很是繁多,但其实只要归成4类:InputStream
& OutputStream
、Reader
& Writer
,因为功能和命名上都至关接近,所以只要掌握了其中一种,将会很容易理解其余3种。java
横向归类:InputStream
& OutputStream
(字节流)、Reader
& Writer
(字符流).
纵向归类:InputStream
做为父类,其子类的角色和做用,并以此触类旁通。api
字节(byte)是计算机中基本数据单位,一切的计算机数据(或“文件”)都是由或多或少的字节组成,所以使用字节流,理论上能够处理一切计算机数据(文件),包括图像、音频、文本等。数组
然而对于文本数据,因为存在编码问题比较麻烦,因此交由字符流处理。oracle
1char=2byte,字符(char)的表示范围(2^16)是字节(byte)表示范围(2^8)的2^8=256倍。专门用于处理文本数据。dom
字节流在Java的第一版(jdk 1.0)已经存在,字符流在jdk 1.1中加入,以替代字节流中处理字符的功能。性能
私觉得,提到Java I/O的话,不能不提装饰者模式。ui
装饰者模式就是在一个主体(被装饰者)的外部使用装饰类来进行装饰,对主体的行为根据不一样的装饰者类进行不一样的修改。单个的装饰类自根据自身特色对主体的行为进行部分改进,所以能够组合多个装饰类来对主体进行修改(在代码中表现为多层装饰类的嵌套)。编码
Java的I/O类设计应用了装饰者模式。单个的流对象主体,例如InputStream
的直接子类(Direct Subclasses)中,分别面向文件FileInputStream
、内存ByteArrayInputStream
、线程PipedInputStream
,而InputStream
的另外一个直接子类FileterInputStream
为装饰类(的父类),分别定义了各类具体的装饰类(如BufferedInputStream
、DataInputStream
等)。线程
如图: 设计
从代码的角度来看:DataInputStream
、BufferedInputStream
为装饰者,FileInputStream
为主体(被装饰者)
InputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(new File(src))));
装饰者模式从抽象的角度来讲很容易理解,然而也存在一个很明显的缺点:装饰类过多。所以咱们能看到java.io包中那么多的类。若是没有理解装饰者模式,即便有必定经验的Java developer也会感到混乱。
例如对于文件复制这样的操做来讲,即便是文本文件的复制,咱们对其具体的内容是什么并不关心,所以能够直接使用字节流。但当咱们要从一个文本文件中读取内容,咱们关心其具体的内容,因此使用字符流。
篇幅所限,只列出经常使用的类,其他部分可参考Java API手册。
InputStream
合并成一个;BufferedOutputStream
;本篇做为Java I/O系列之一,只分析了字节流和字符流。其余Java I/O内容如File、RandomAccessFile、System类的I/O支持和重定向、字符编码、文件压缩、对象序列化和Scanner等内容会在(2/3)中发表。
NIO部分打算在(3/3)中发表。