TeeInputStream和PipedStream在任何情况下都不起作用

时间:2013-12-10 11:38:40

标签: java io java-io apache-commons-io

我在“克隆”InputStream时遇到了问题。

这不起作用:

InputStream is = ClassLoader.getSystemResourceAsStream("myResource");

但这有效:

InputStream is = new BufferedInputStream(new FileInputStream("/afas.cfg"));

我的代码是:

// Create a piped input stream for one of the readers.
PipedInputStream in = new PipedInputStream();

// Create a tee-splitter for the other reader.(from apache commons io)
TeeInputStream tee = new TeeInputStream(is, new PipedOutputStream(in));

// Create the two buffered readers.
BufferedReader br1 = new BufferedReader(new InputStreamReader(tee));
BufferedReader br2 = new BufferedReader(new InputStreamReader(in));

// Do some interleaved reads from them.
System.out.println("One line from br1:");
System.out.println(br1.readLine());
System.out.println();

System.out.println("Two lines from br2:");
System.out.println(br2.readLine());
System.out.println(br2.readLine());
System.out.println();

System.out.println("One line from br1:");
System.out.println(br1.readLine());
System.out.println();

问题出现在第一次br1.readLine()来电时。它只是停留在PipedInputStream.awaitSpace()并处于无限循环中。

PipedStreams仅用于线程吗?这意味着当写入PipedOutputStreams时,PipedInputStream会“唤醒”

在任何情况下,我必须做些什么才能完成这项工作?

1 个答案:

答案 0 :(得分:1)

这是对管道流的误用。它们旨在由不同的线程使用。它们不会像你在这里使用它们那样工作,因为它有一个4k的缓冲区,写入器在填充时会阻塞。来自Javadoc

不建议尝试使用单个线程中的两个对象,因为它可能使线程死锁。

就我个人而言,自1997年5月以来,我从未遇到过对这些管道流的有效使用。我曾经使用过一次,并立即将其取出以支持队列。