Java 为什么我不能让pipedinput/outputstreams工作

Java 为什么我不能让pipedinput/outputstreams工作,java,io,Java,Io,我正在努力为自己弄清楚PipedInputStream和PipedOutStream是如何协同工作的。到目前为止,结果是彻底失败 这是我的代码: import java.io.*; public class Test implements Runnable { private PipedOutputStream pause_breaker; private PipedInputStream pause_breaker_listener; private BufferedReade

我正在努力为自己弄清楚PipedInputStream和PipedOutStream是如何协同工作的。到目前为止,结果是彻底失败

这是我的代码:

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

您有两个问题:

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

  • 您需要修改线程的通信方式,即是时候退出了。读线程有一个无限循环,而写线程在写一行后立即终止,因此读线程抛出
    IOException:pipe break

  • pw.println(“测试”)
    因为读线需要换行。