首页 > 解决方案 > 为什么我不能让管道输入/输出流工作

问题描述

我正在尝试自己解决 PipedInputStream 和 PipedOutputStream 如何协同工作。到目前为止,结果是完全失败。

这是我的代码:

import java.io.*;

public class Test implements Runnable {

  private PipedOutputStream pause_breaker;
  private PipedInputStream pause_breaker_listener;
  private BufferedReader br;
  private PrintWriter pw;

  public void run() {
    try {
      while(true) {
        System.out.println("Now listening...");
        String text = br.readLine();
        System.out.println("...got " + text);
      }
    } catch(Exception e) {
      System.out.println("run: " + e.getMessage());
    }
  }
  
  public void pause_test() {
    try {
      // testing piped streams as pausing tool
      pause_breaker = new PipedOutputStream();
      pause_breaker_listener = new PipedInputStream();
      pause_breaker_listener.connect(pause_breaker);
      //pause_breaker.connect(pause_breaker_listener);
      br = new BufferedReader(new InputStreamReader(pause_breaker_listener));
      pw = new PrintWriter(pause_breaker);
      Thread.sleep(1000);
      new Thread(this).start();
      System.out.println("Waiting for new Thread...");
      //Thread.sleep(1000);
      System.out.println("Writing to stream...");
      pw.write("Test");
      pw.flush();
    } catch(Exception e) {
      System.out.println("pause_test: " + e.getMessage());
    }    
  }
  
  public static void main(String[] args) {
    Test t2 = new Test();
    t2.pause_test();
  }

}

输出是这样的:

$ java Test 
Waiting for new Thread...
Writing to stream...
Now listening...
run: Write end dead

似乎什么都没有通过。谁能指出我为什么?

/dr_xemacs

标签: javaio

解决方案


你有两个问题:

  1. 由于您使用 BufferedReader 从管道中获取项目,因此每个项目都需要有一个尾随换行符

  2. 您需要修改线程如何传达该退出的时间。读取线程有一个无限循环,而写入线程在写完一行后立即终止,因此读取线程抛出IOException: pipe broken.


推荐阅读