简介
这一章我们主要围绕Java IO (BIO) 下所有的类进行概述,根据类的用途进行分组,这样会你更好的理解BIO 的模型。
输入和输出-数据源和目标媒介
术语“输入”和“输出”有时候会有一点让人疑惑,一个应用程序的输入往往是另外一个应用程序的输出,那么OutputStream流到底是一个输出到目的地的流呢?还是一个产生输出的流。 InputStream流到底会不会输出它的数据给读取数据的程序呢?我们不妨用一些名词来代替我们的理解,让他们从概念上与数据来源和数据流向相联系。
Java的IO包主要关注的是从原始数据源的读取以及输出原始数据到目标媒介。以下是最典型的数据源和目标媒介:
- 文件
- 管道
- 网络连接
- 内存缓存
- System.in, System.out, System.error(注:Java标准输入、输出、错误输出)
下面这张图描绘了一个程序从数据源读取数据,然后将数据输出到其他媒介的原理:
流
Java IO 中,流是一个核心的概念。流从概念上来说是一个连续的数据流。你既可以从流中读取数据,也可以往流中写数据。流与数据源或者数据流向的媒介相关联。在Java IO中流既可以是字节流(以字节为单位进行填写),也可以是字符流(以字符为单位进行读写)。
InputStream、OutputStream,Reader和 Writer
一个程序需要InputStream或者Reader从数据源读取数据,需要OutputStream或者Writer将数据写入到目标媒介中。以下的图说明了这一点
InputStream和Reader与数据源相关联,OutputStream和writer与目标媒介相关联。
Java IO的用途和特征
Java IO中包含了许多InputStream、OutputStream、Reader、Writer的子类。这样设计的原因是让每一个类都负责不同的功能。这也就是为什么IO包中有这么多不同的类的缘故。各类用途汇总如下:
- 文件访问
- 网络访问
- 内存缓存访问
- 线程内部通信(管道)
- 缓冲
- 过滤
- 解析
- 读写文本 (Readers / Writers)
- 读写基本类型数据 (long, int etc.)
读写对象
当通读过Java IO 类的源代码之后,我们很容易就能了解这些用途。这些用途或多或少让我们更加容易的理解,不同的类用于针对不同业务场景。
Java IO 类概述表
已经讨论了数据源、目标媒介、输入、输出和各类不同用途的Java IO类,接下来是一张通过输入、输出、基于字节或者字符、以及其他比如缓冲、解析之类的特定用途划分的大部分Java IO类的表格。
Byte Based Input | Output | Charater Based Input | Output | |
---|---|---|---|---|
Basic | InputStream | OutputStream | Reader InputStreamReader | Writer OutputStreamWriter |
Arrays | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
Files | FileInputStream RandomAccessFile | FileOutputStream RandomAccessFile | FileReader | FileWriter |
Pipes | PipedInputStream | PipedOutputStream | PipedReader | PipedWriter |
Buffering | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferedWriter |
Filtering | FilterInputStream | FilterOutputStream | FileReader | FilterWriter |
Parsing | PushbackInputStream Stream Tokenizer | PushbackReader LineNumberReader | ||
Strings | StringReader | StringWriter | ||
Data-Formatted | PrintStream | PrintWriter | ||
Objects | ObjectInputStream | ObjectOutputStream | ||
Utilites | SequenceInputStream |