说到IO,在咱们工做中是常常遇到的,好比文件的上传、网络的数据传输、系统的日志记录等,俯拾皆是。Java里面是怎么实现IO的,今天咱们一块儿学习下。java
Java种IO是经过流的方式实现的,流能够理解为一个序列的数据,Java中定义了字节流和字符流,字节流顾名思义它处理的基本单位就是字节,字符流处理的基本单元是Unicode码元(1字符=2字节),String类型叫作字符串,字符串在内存里也是Unicode的码元。流还有另一种分类方法,就是输入流和输出流,把对象(文件、图片等)读入程序中须要用输入流,程序中须要写入文件时须要用输出流,这只是一个方向的问题。下面作下简单整理:设计模式
JDK中java.io包下是关于io操做的类。按照上面的分类,看下都有哪些类,下图是我收藏的一张关于JDK中IO部分的分类:数组
1. 字符流网络
StringReader、CharArrayReader是主要的介质类,分别从String和Char数组中读取数据;学习
PipedReader是一个管道流,是从与其余线程共用的管道中读取数据;编码
BufferedReader是一个装饰器类(若是对装饰者模式不熟悉的,能够查看个人设计模式篇中的装饰者模式的介绍),spa
FilterReader是个抽象类,他是PushbackReader类的父类。线程
InputStreamReader是链接字符流和字节流的桥梁,它能够将字节流转换为字符流。FileReader就是它的一个子类,实现了将文件的输入字节流转换为输入字符流的功能。设计
CharArrayWriter、StringWriter是两种基本的介质流,分别面向Char数组、String写入数据。日志
PipedWriter是一个管道输出流,向与其余共用的管道中写入数据
BufferedWriter是一个装饰器类,为Writer子类提供缓冲功能。
OutputStreamWriter是OutputStream到Writer转换的桥梁,FileWriter是它的子类,实现了将文件输出字节流转换为输出字符流的功能。
2. 字节流
FileInputStream、StringBufferInputStream、ByteArrayInputStream是字节输入流的三个介质类,分别从本地文件、String缓冲区、Byte数组中读取数据;其中的StringBufferInput已经再也不建议使用了
FilterInputStream是装饰器类的父类,下面有BufferedInputStream、DataInputStream、PushbackInputStream
ObjectInpuStream、SequenceInputStream都是装饰器类
PipedInputStream是一个管道字节流, 是从与其它线程共用的管道中读取数据
FileOutputStream、ByteArrayOutputStream是两个基本的介质流类,分别向本地文件、byte数组写入数据。PipedOutputStream是向与其余线程共用的管道中写入数据。
ObjectOutputStream及FilterOutputStream的子类都是装饰器类。
3. 字节流和字符流的使用场景
JDK早期版本中就提供了字节流和字符流的两种处理方式,字符流的处理单位是码元,效率比字节要高一些,可是并不表明字符流就比字节流具备优点。好比常见的图片,由于它的编码格式和常规的字符编码格式不一致,因此字符流对于图片这类文件就显者一筹莫展了。字节流和字符流各具优点,不能互相代替。
这一篇,对IO部分有了初步的认识,下篇将介绍IO的发展史,什么是BIO、NIO、AIO。欢迎关注。