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