【问题标题】:TeeInputStream and PipedStream does not work in any caseTeeInputStream 和 PipedStream 在任何情况下都不起作用
【发布时间】:2013-12-27 21:52:31
【问题描述】:

我在“克隆”一个 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 将“唤醒”

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

【问题讨论】:

  • 是的,PipedStreams 需要在不同的线程中。
  • 但是如果我直接通过new FileInputStream(...) ?创建InputStream,为什么InputStream会起作用
  • 您的代码看起来有点可疑。您确定按照您的意图构建所有流吗?
  • 只是一个例子,类似这个java-success.blogspot.de/2013/05/…

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


【解决方案1】:

这是对管道流的滥用。它们旨在供不同的线程使用。当您在此处使用它们时,它们将无法工作,因为有一个 4k 缓冲区,并且写入器在填充时会阻塞。来自Javadoc

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多