理解数据流
数据流(Stream)是一组有顺序的,有起点的,有终点的字节集合,是对输入和输出的总称和抽象。
一般地,数据流分为 输入流(InputStream)和输出流(OutputStream)。输入流只能读不能写,而输出流只能写不能读。通常程序使用输入输出流,就好像数据流入程序,或从程序流出。
Java 程序通过流来完成输入输出。 流通过 java 的输入输出系统与物理设备连接,尽管与它们连接的物理设备不尽相同,所有流的行为具有同样的方式。这样,相同的输入输出类和方法适用于所有类型的外部设备。这意味着一个输入流能够抽象多种不同类型的输入:从磁盘文件,从键盘或从网络套接字。同样,一个输出流可以输出到控制台,磁盘文件或相连的网络。流是处理输入输出的一个简便的方法。
把输入流的指向称作为数据源(Data Source),把输出流的指向称作数据接收器(Data Sink),程序从数据源读入数据,向接收器写数据,如下示意图:
java 流的划分
Java2 定义了两种类型的流: 字节流 和 字符流。字节流(Byte Stream)为处理字节的输入和输出提供了方法。例如:使用字节流读取或书写二进制数据。字符流(Character Stream)为 字符的输入和输出提供了方便。它们采用了统一的编码标准,因而可以国际化。 在某些场合,字符流比字节流更有效。
需要说明的是,在最底层,所有的输入输出都是字节形式的。基于字符的流只为处理字符提供方便有效的方法。
字节流类
字节流在顶层由两个抽象类:InputStream 和 OutputStream。每个抽象类都有多个具体的子类,这些子类对不同的外设进行处理,例如磁盘文件,网络连接,甚至是内存缓冲区。
字节输入流 如下图所示,灰色背景的类在使用的时候,需要具体的物理设备,如文件、数组、管道等。白色背景的类(抽象类除外)在使用时,需要其他流的支持。
字节输入流的说明如下:
流 | 描述 |
---|---|
InputStream | 表示输入字节流的抽象类 |
FileInputStream | 文件字节输入流 |
ByteArrayInputStream | 字节数组输入流,把字节数组作为数据源 |
FilterInputStream | 过滤字节输入流,提供扩展功能的输入流 |
PipedInputStream | 管道输入流,可用于线程之间通信 |
ObjectInputStream | 对象输入流 |
SequenceInputStream | 顺序输入流,把多个流顺序合并成一个流 |
AudioInputStream | 音频输入流 |
BufferedInputStream | 缓冲输入流 |
CipherInputStream | 加密输入流,在输入过程中,对数据进行加密或解密 |
DataInputStream | 包含读取 Java 标准数据类型方法的输入流 |
DigestInputStream | 摘要数据流,在输入过程中,生成流的数组摘要 |
ProgressMonitorInputStream | 过程监视输入流 |
PushbackInputStream | 能够向输入流退回一个字节的输入流 |
字节输出流的说明如下:
流 | 描述 |
---|---|
OutputStream | 表示输出字节流的抽象类 |
FileOutputStream | 文件字节输出流 |
ByteArrayOutputStream | 字节数组输出流,把字节数组作为数据接收器 |
FilterOutputStream | 过滤字节输出流,提供扩展功能的输出流 |
PipedOutputStream | 管道输出流,可用于线程之间通信 |
ObjcetOutputStream | 对象输出流 |
BufferedOutputStream | 缓冲输出流 |
CipherOutputStream | 加密输出流,在输出过程中,对数据进行加密或解密 |
DataOutputStream | 包含写 Java 标准数据类型方法的输出流 |
DigestOutputStream | 摘要数据流,在输出过程中,生成流的数字摘要 |
PrintStream | 打印流,包含 print() 和 println()的输出流 |
抽象类 InputStream 和 OutputStream 定义了实现其他流类的关键方法。最重要的两种方法时 read() 和 write() ,它们分别用于读写字节。 两种方法都在 InputStream 和 OutputStream 中被定义为抽象方法。它们被派生的流类重写。
字节流中还有一个流:RandomAccessFile ,支持随机地存取文件中的内容。
字符流类
字符流类顶层由两个抽象类:Reader 和Writer。这些抽象类处理统一编码的字符流。java 中有多个具体的子类。
字符输入流的描述
流 | 描述 |
---|---|
Read | 表示字符输入流的抽象类 |
BufferedReader | 带缓冲功能的字符输入流 |
CharArrayReader | 把字符数组作为输入源的输入流 |
FilterReader | 过滤字符输入流 |
InputStreamReader | 字节流向字符流转化流 |
PipedReader | 管道字符输入流 |
StringReader | 把字符串作为数据源的输入流 |
LineNumberReader | 能够统计行数的输入流 |
PushbackReader | 能够向输入流退回一个字符的输入流 |
FileReader | 文件字符输入流 |
字符输出流的描述
流 | 描述 |
---|---|
Writer | 描述字符输出流的抽象类 |
BufferedWriter | 带缓冲功能的字符输出流 |
OutPutStreamWriter | 字节输出流向字符输出流的转换 |
CharArrayWriter | 把字符数组作为数据接收器 |
FilterWriter | 过滤字符输出流 |
PipedWriter | 管道字符输出流 |
PrintWriter | 打印字符输出流,类似于PrintStream |
StringWriter | 把字符串作为数据接收器 |
FileWriter | 文件字符输出流 |
抽象类 Reader 和 Writer 定义了几个实现其他流类的关键方法。其中两个最重要的是 read() 和 write() ,它们分别进行字符数据的读 和 写。这些方法被派生流类重写。