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)
这个对象拓展它的功能来适应不同的场景。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。