I/ O 输入 / 输出(Input/Output)
,从直观意义上来说,就是计算机的输入与输出操作,描述的是计算机数据的流动过程。在编程语言的 I / O 类库中经常使用流这个概念,它代表任何有能力产出数据的数据源对象或任何有能力接收数据的接收端对象,使用流可以有效的屏蔽实际 I / O 设备处理数据的细节。
InputStream 和 OutputStream
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());
}
}
}
InputSream
InputStream
用来表示从不同的数据源产生输入的类, 这些数据源包括:
- 字节数组
- String 对象
- 文件
- “ 管道 ”
- 一个由其他种类的流组成的序列
- 其他数据源
每一个数据源都有相应的 InputStream
子类,FilterInputSream
也属于一种 InputSream(稍后讨论)为 ” 装饰器 ” 提供基类。下面是 InputSream 常用的子类:
类 | 功能 |
---|---|
ByteArrayInputSream | 将内存的缓冲区当作 InputSream 使用 |
StringBufferInputSream | 将 String 转换成 InputSream |
FileInputSream | 用于从文件读取信息 |
OutputSream
同样的根据输入源,OutputSream
决定了输出所要去往的目标: 字节数组、文件或管道、FilterOutputStream
(稍后讨论)。
类 | 功能 |
---|---|
ByteArrayOutputSream | 在内存中创建缓冲区,所有送往 ” 流 ” 的数据都要放置在此缓冲区 |
FileOutputSream | 用于将信息写至文件 |
FilterInputStream 和 FilterOutputStream
在 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)
这个对象拓展它的功能来适应不同的场景。