I/O输入/输出(Input/Output) ,从直观意义上来说,就是计算机的输入与输出操作,描述的是计算机数据的流动过程。在编程语言的I/O类库中经常使用流这个概念,它代表任何有能力产出数据的数据源对象或任何有能力接收数据的接收端对象,使用流可以有效的屏蔽实际I/O设备处理数据的细节。
java中流的操作都是从 InputStream 和 OutputSream 中派生出来的,用于读取和写入单个字节和字节数组。由于 InputStream 和 OutputSream 是面向字节的,所以们通常不会直接使用它,而是通过叠合多个对象来提供所期望的功能。
例如一个实现文件复制的程序,数据源从文件输入流到字节数据输入流,再通过字节数据输出流到文件输出流。
public class CommonApplication {
private static String finePath = "/Users/htx/Public/project/instrument-api/common/src/main/java/com/mengyunzhi/common/";
public static void main(final String[] args) throws IOException {
DataInputStream dataInputStream = new DataInputStream(new FileInputStream(finePath + "data.txt"));
DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(finePath + "copy.txt"));
while (dataInputStream.available() != 0) {
dataOutputStream.writeByte(dataInputStream.readByte());
}
}
}
InputStream 用来表示从不同的数据源产生输入的类,这些数据源包括:
每一个数据源都有相应的 InputStream 子类, FilterInputSream 也属于一种InputSream(稍后讨论)为"装饰器"提供基类。下面是InputSream常用的子类:
| 类 | 功能 |
|---|---|
| ByteArrayInputSream | 将内存的缓冲区当作InputSream使用 |
| StringBufferInputSream | 将String转换成InputSream |
| FileInputSream | 用于从文件读取信息 |
同样的根据输入源, OutputSream 决定了输出所要去往的目标:字节数组、文件或管道、 FilterOutputStream (稍后讨论)。
| 类 | 功能 |
|---|---|
| ByteArrayOutputSream | 在内存中创建缓冲区,所有送往"流"的数据都要放置在此缓冲区 |
| FileOutputSream | 用于将信息写至文件 |
在 javaI/O 类库中需要多种不同功能的组合,这正式使用装饰器模式的理由。我们使用不用的 FilterInputSream(FilterOutputSream) 来装饰 InputStream(OutputStream) 来获取不同的功能。
常用的 FilterInputStream :
| 类 | 功能 |
|---|---|
| DataInputSream | 与DataOutputSream搭配使用,因此可以按照可移植方式从流读取基本的数据类型(int char long) |
| BufferInputStream | 可以防止每次读取时都得进行实际写操作。代表使用缓冲区 |
常用的 FilterOutputtSream :
| 类 | 功能 |
|---|---|
| DataOutputStream | 与DataInputSream 搭配使用,因此可以按照可移植的方式向流中写入基本类型数据(int,char long) |
| BufferedOutputStream | 使用它避免每次发送数据时都要进行实际的写操作。代表使用缓冲区 |
FilterInputStream(FilterOutputStream) 的构造函数中都可以传入一个 InputStream(OutputStream) 对象,它的功能就是装饰 InputStream(OutputStream) 这个对象拓展它的功能来适应不同的场景。