说明:本文内容较通识,参考了部分帖子进行融合整理(有些字能少大就少大嘛…)
流的概念
流(Stream )的概念代表的是程序中数据的流通,数据流是一串连续不断的数据的集合,在Java程序中,对于数据的输入/输出操作是以流(Stream)的方式进行的。
IO体系
java的IO体系看起来是很复杂的,其主要原因是IO涉及到的因素太多。所以设计者根据不同的数据类型、数据量、数据传输方式、应用场景、数据流动方向设计了不同的IO类。只要领会了设计者的初衷,掌握Java的IO体系结构其实不难。下面我们根据这些设计者考虑到的因素对Java IO进行分类梳理。
字节字符流
不管以何种方式传输数据在数据传输的最底层都是传输一个个二进制位,但是不同二进制位及其值的组合可以代表某种含义,Java IO中以一个字节为最小内存单位。一般情况下数据在传输过程中可将数据分为字符(各种文本文件)和二进制数据(图片、音频、程序)两大类型,字符型数据存在编码因素(如UTF8编码是3个字节)。
- 字节流:以字节为单位输入输出数据,类名后缀有Stream的都是字节流。
- 字符流:以字符为单位输入输出数据,类名后缀有Reader或是Writer的都是字符流
- InputStream和OutputStrea这两个抽象类是所有字节流得到基类。
- Reader和Writer这两个抽象类是所有字符流的基类。
输入输出流
输入输出流根据数据的流向进行分类,数据流向(输出)到别处的成为输出流,数据从别的地方流入(输入)的成为输入流。这两中类型的IO类通过其类名很容易区分。
- 输入流:从别处获取数据的流,类名中含有Input或Reader的都是输入流
- 输出流:将数据输出到别处的流,类名中含有Output或是Writer的都是输出流
如果按照数据输出方式和流通方向可以将Java的IO体系结构划分如下图所示。
缓冲流
上文提到不同的IO类适用于不同的场景,当输入输出的数据量较大时应当使用缓冲流,这样不仅可以降低内存暂用还能提高读写速度。
- 缓冲流:具有缓冲功能的IO流,IO类的类名带有Buffered的都是具有缓冲功能的缓冲流。
不同数据类型的流
Java IO不仅根据数据流动方向、传输方式、数据量进行设计,还针对常见的数据类型设计了专用的IO类,方便开发使用。
- 文件流:FileInputStream、FileOutputStream、FileReader、FileWriter
- 数组流:ByteArrayInputStream、ByteArrayOutputStream、CharArrayReader、CharArrayWriter
- 基本数据类型流:DataInputStream、DataOutputStream
- 字符串(String)Java8中已废弃:StringBufferInputStream、StringBufferOutputStream、StringReader、StringWriter
不同应用场景的流:
- 管道操作:PipedInputStream、PipedOutputStream、PipedReader、PipedWriter
- 打印:PrintStream、PrintWriter
- 对象序列化反序列化:ObjectInputStream、ObjectOutputStream
- 字节流到字符串的转换流:InputStreamReader、OutputStreamWriter
如果按数据类型、数据量、应用场景可以将Java的IO体系划分为下图所示。