本节将介绍主要的流类
管道流PipedReader,PipedWriter
这里只介绍管道字符流,字节流PipedInputStream,PipedOutputStream类同。什么是管道流呢?管道流可以在线程间通信,输入流和输出流相连后便形成了管道。两线程间不共享数据,有别于共享数据通信。下图如示
管道流连接方式,即输入流与输出流相连接形成管道,而且输入流和输出流在不同线程中操作。以PipedReader示例,两种方式连接:
直接使用构造函数PipedReader(PipedWriter src);PipedReader(PipedWriter src, int pipeSize);
使用方法void connect(PipedWriter src);
代码示例
分别定义了发送线程,接收线程。
public class TestPipe {
static class SendThread extends Thread{
private PipedWriter pipedWriter = null;
private String sendMessage = null;;
public SendThread(String message){
this.setName("SendThread");
this.sendMessage = message;
this.pipedWriter = new PipedWriter();
}
public void run(){
try {
pipedWriter.write(sendMessage);
pipedWriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public PipedWriter getPipedWriter() {
return pipedWriter;
}
}
static class RevicerThread extends Thread{
private PipedReader pipedReader = null;
public RevicerThread(){
this.setName("RevicerThread");
this.pipedReader = new PipedReader();
}
public void run(){
try {
LineNumberReader lnr = new LineNumberReader(pipedReader);
String line = lnr.readLine();
lnr.close();
pipedReader.close();
System.out.println("接收线程RevicerThread接收到消息:"+line);
} catch (Exception e) {
e.printStackTrace();
}
}
public PipedReader getPipedReader() {
return pipedReader;
}
}
public static void main(String[] args) {
try {
SendThread sender = new SendThread("这是发送线程sendTread发送的消息.");
RevicerThread revicer = new RevicerThread();
sender.getPipedWriter().connect(revicer.getPipedReader());
sender.start();
revicer.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
连接多个流SequenceInputStream
表示多个输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。不再给出示例。
可以回推的输入流PushBackInputStream,PushbackReader
即可以对已读出的数据重新回推到输入流,下次读取的时候重新读取。例子待续。
对象序列化流
这里只给出ObjectInputStream继承关系图,ObjectOutputStream类似。想详细了解Java序列化请看《Java对象序列化》章节。