3.1.5 其他输入输出流

在java.io包中,还有一些实用的输入输出流的实现,比如进行文件读写操作的FileInputStream类和FileOutputStream类,作为字节数组和流之间的桥梁的ByteArrayInputStream类和ByteArrayOutputStream类。这两对输入输出流的使用比较简单,这里不再赘述。

使用过UNIX和Linux操作系统的开发人员对使用命令行工具时可用的管道操作符(“|”)可能都不陌生。每个命令行工具都接收一定的输入数据,完成处理之后再产生相应的输出结果。通过管道操作符可以把一个命令行工具的输出作为另一个工具的输入,从而使它们级联起来,可以简洁地实现复杂的功能。Java中的java.io.PipedInputStream类和java.io.PipedOutputStream类就是这样一对通过管道方式连接在一起的输入和输出流。一个PipedInputStream类的对象和一个PipedOutputStream类的对象连接在一起之后,通过PipedOutputStream类的对象所写入的数据可以在PipedInputStream类的对象中读取到。两者的连接既可以通过构造方法来完成,也可以通过connect方法来实现。从设计的角度来说,这实际上实现了典型的数据生产者-消费者模式。不过需要注意的是,使用PipedInputStream类和PipedOutputStream类的对象要在不同的线程之中,否则容易出现死锁的问题。

另外一个特殊的输入流是java.io.SequenceInputStream类。它可以把多个输入流按顺序连接起来,形成一个完整的输入流。调用SequenceInputStream类的对象的read方法会依次读取底层输入流中的内容。当一个输入流中的内容读取完毕之后,再换下一个输入流进行读取,直到所有底层输入流都读取完毕。SequenceInputStream类的作用相当于多个InputStream类的对象的连接操作。