简介

这一章我们主要围绕Java IO (BIO) 下所有的类进行概述,根据类的用途进行分组,这样会你更好的理解BIO 的模型。

输入和输出-数据源和目标媒介

术语“输入”和“输出”有时候会有一点让人疑惑,一个应用程序的输入往往是另外一个应用程序的输出,那么OutputStream流到底是一个输出到目的地的流呢?还是一个产生输出的流。 InputStream流到底会不会输出它的数据给读取数据的程序呢?我们不妨用一些名词来代替我们的理解,让他们从概念上与数据来源和数据流向相联系。
Java的IO包主要关注的是从原始数据源的读取以及输出原始数据到目标媒介。以下是最典型的数据源和目标媒介:

  • 文件
  • 管道
  • 网络连接
  • 内存缓存
  • System.in, System.out, System.error(注:Java标准输入、输出、错误输出)

下面这张图描绘了一个程序从数据源读取数据,然后将数据输出到其他媒介的原理:
image.png

Java IO 中,流是一个核心的概念。流从概念上来说是一个连续的数据流。你既可以从流中读取数据,也可以往流中写数据。流与数据源或者数据流向的媒介相关联。在Java IO中流既可以是字节流(以字节为单位进行填写),也可以是字符流(以字符为单位进行读写)。

InputStream、OutputStream,Reader和 Writer

一个程序需要InputStream或者Reader从数据源读取数据,需要OutputStream或者Writer将数据写入到目标媒介中。以下的图说明了这一点

image.png

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