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

Java TeeInputStream和PipedStream在任何情况下都不起作用,java,io,java-io,apache-commons-io,Java,Io,Java Io,Apache Commons Io,我在“克隆”输入流时遇到问题 这不起作用: InputStream is = ClassLoader.getSystemResourceAsStream("myResource"); 但这是可行的: InputStream is = new BufferedInputStream(new FileInputStream("/afas.cfg")); 我的代码是: // Create a piped input stream for one of the readers. PipedInput

我在“克隆”输入流时遇到问题

这不起作用:

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()
上,处于一个无休止的循环中

管流是否仅用于螺纹?这意味着当写入PipedOutStreams时,PipedInputStream将“唤醒”


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

这是对管道流的滥用。它们用于不同的线程。当您在这里使用它们时,它们将无法工作,因为存在4k缓冲区,并且写入程序在填充时会阻塞。从:

不建议尝试从单个线程使用这两个对象,因为这可能会使线程死锁。
就我个人而言,自1997年5月以来,我从未遇到过这些管道流的有效使用。当时我曾使用过一个,并立即将其取出以支持队列。

是的,管道流需要位于不同的线程中。但是,如果我直接通过
新文件InputStream(…)创建InputStream,那么如果InputStream,为什么它会起作用?
您的代码看起来有点不确定。你确定你正在按照你的意愿构建所有的流吗?这只是一个例子,与此类似