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

标签 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 将“唤醒”

无论如何,我必须做什么才能完成这项工作?

最佳答案

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

Attempting to use both objects from a single thread is not recommended, as it may deadlock the thread.

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

关于java - TeeInputStream 和 PipedStream 在任何情况下都不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20493479/

相关文章:

java - 在没有父类主体的情况下用 Java 编译插件代码

java : mapping the Values from Enumeration to Object

java - 如何使用 Builder 模式将 Parcelable 实现到一个类

java - 我将如何跨多行搜索一串单词

java - 从 Java 生成的 CSV 文件添加了不需要的问号 (?)

java - 在JAVA中多次处理大文件

java - 我如何转换字符串以将其实现为数据库字段 - Java/Spring/Postgres?

Ruby:从文本文件中随机选择一行的优雅方法是什么?

c++ - 为什么 C++ 输出比 C 慢太多?

java - Java中计算文件行数