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



在"克隆"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()上,并处于无休止的循环中。

PipedStream是否仅用于线程?这意味着在向PipedOutputStream写入时,PipedInputStream将"唤醒"

无论如何,我该怎么做才能完成这项工作?

这是对管道流的滥用。它们用于不同的线程。当你在这里使用它们时,它们不会起作用,因为有一个4k的缓冲区,写入程序在填充时会阻塞。来自Javadoc:

不建议尝试从单个线程使用这两个对象,因为这可能会使线程死锁

就我个人而言,自1997年5月以来,我从未遇到过对这些管道流的有效使用。当时我用过一次,为了排队,我立刻把它拿了出来。

相关内容

  • 没有找到相关文章

最新更新