1
I/O输入/输出(Input/Output),从直观意义上来说,就是计算机的输入与输出操作,描述的是计算机数据的流动过程。在编程语言的I/O类库中经常使用流这个概念,它代表任何有能力产出数据的数据源对象或任何有能力接收数据的接收端对象,使用流可以有效的屏蔽实际I/O设备处理数据的细节。

InputStream和OutputStream

java中流的操作都是从InputStreamOutputSream中派生出来的,用于读取和写入单个字节和字节数组。由于InputStreamOutputSream是面向字节的,所以们通常不会直接使用它,而是通过叠合多个对象来提供所期望的功能。

例如一个实现文件复制的程序,数据源从文件输入流到字节数据输入流,再通过字节数据输出流到文件输出流。

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());
        }
    }
}

image.png

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)这个对象拓展它的功能来适应不同的场景。


鲸冬香
456 声望27 粉丝