Java IO(十三)PipedReader 和 PipedWriter
一、介绍
PipedReader 和 PipedWriter 分别是管道字符输入流和管道字符输出流,它们同 PipedInputStream 和 PipedOutputStream 一样,用于管道通讯,相关功能都是类似的。它们的作用是可以通过管道进行线程间的通讯。在使用管道通信时,必须将 PipedWriter 和 PipedReader 配套使用。
- PipedReader :管道字符输入流,继承于Reader。
- PipedWriter:管道字符输出流,继承于Writer。
二、构造方法
(一)、PipedReader
(二)、PipedWriter
三、常用API
(一)、PipedReader
(二)、PipedWriter
四、实例
多线程通过 PipedWriter 和 PipedReader 进行线程间同通讯,下面例子分别定义三个类:PipedDemo(主线程main类),PipedSender(发送者对象,PipedWriter)、PipedReceiver(接收者对象,PipedReader)。实例中只贴出主要代码。同 PipedInputStream 和 PipedOutputStream 实例类似。
注意点:
管道输入流 PipedInputStream 与管道输出流 PipedOutputStream 建立连接
建立连接一般使用 connect() 方法连接或在创建输入流对象时,传递连接该管道的输出流对象。
connect() ,如:out.connect(in) 和 in.connect(out) 是等价的,开发时只能选择其中的一个而不能两个 connect 同时调用,否则会抛出 java.io.IOException: Already connected 异常。
创建流对象,如:PipedWriter out = new PipedWriter (in),in 为 PipedReader 对象,必须先实例化使用,否则会报 java.lang.NullPointerException 异常。PipedWriter out = new PipedWriter (in) 与 PipedReader in = new PipedReader (out) 是等价的,开发时传递的流对象作为参数必须实例化,然后进行传递。
(一)、PipedSender(发送者对象,PipedWriter)
public class PipedSender implements Runnable{ private static char[] chs = new char[] {'a','b','c','d','e','f','g','h','i','j','k','l','m', 'n','o','p','q','r','s','t','u','v','w','x','y','z'}; PipedWriter wr = new PipedWriter(); public PipedWriter getPipedWriter() { return wr; } public void run() { sendOne(); // 写入较短数据 sendMove();// 写入较长数据 } /** * 写入较短数据 */ private void sendOne() { try { wr.write("this is a PipedSender"); }catch(Exception e) { e.printStackTrace(); }finally { try { if (wr != null) wr.close(); }catch(Exception e) { e.printStackTrace(); } } } /** * 写入较长数据 */ private void sendMove() { try { StringBuffer sb = new StringBuffer(); for (int i = 0; i < 100; i++) { sb.append("0123456789"); } sb.append(new String(chs)); String str = sb.toString(); wr.write(chs); wr.write(str); }catch(Exception e) { e.printStackTrace(); }finally { try { if (wr != null) wr.close(); }catch(Exception e) { e.printStackTrace(); } } } }
(二)、PipedReceiver(接收者对象,PipedReader)
public class PipedReceiver implements Runnable { PipedReader re = new PipedReader(); public PipedReader getPipedReader() { return re; } @Override public void run() { readOne(); // 读取一次 readMove(); // 全部读取 } /** * 读取一次数据 */ private void readOne() { char[] buff = new char[2048]; int len = 0; try { len = re.read(buff); System.out.println("readOne : " + new String(buff,0,len)); } catch (IOException e) { e.printStackTrace(); }finally { try { if (re != null) re.close(); }catch(Exception e) { e.printStackTrace(); } } } /** * 全部读取 */ private void readMove() { char[] buff = new char[1024]; int len = 0; try { while(true) { len = re.read(buff); if(len == -1) break; System.out.println("readMove : " + new String(buff,0,len)); } } catch (IOException e) { e.printStackTrace(); }finally { try { if (re != null) re.close(); }catch(Exception e) { e.printStackTrace(); } } } }
(三)、PipedDemo(主线程main类)
public class PipedDemo { public static void main(String[] args) { PipedSender se = new PipedSender(); PipedReceiver re = new PipedReceiver(); PipedWriter out = se.getPipedWriter(); PipedReader in = re.getPipedReader(); try { in.connect(out);// 将输入流与输出流建立连接 // 开启线程 new Thread(se).start(); new Thread(re).start(); }catch(Exception e) { e.printStackTrace(); } } }