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() и находится в бесконечном цикле.

Являются ли PipedStreams только для потоков? Это означает, что при записи в PipedOutputStreams PipedInputStream «проснется»

Что я должен сделать, чтобы получить эту работу в любом случае?


person Zarathustra    schedule 10.12.2013    source источник
comment
Да, PipedStreams должен находиться в разных потоках.   -  person Kayaman    schedule 10.12.2013
comment
Но почему это работает, если InputStream, если я создаю InputStream напрямую через new FileInputStream(...) ?   -  person Zarathustra    schedule 10.12.2013
comment
Ваш код выглядит немного подозрительно. Вы уверены, что строите все потоки так, как намеревались?   -  person Kayaman    schedule 10.12.2013
comment
Это просто пример, похожий на этот java-success.blogspot.de/2013/05/   -  person Zarathustra    schedule 10.12.2013


Ответы (1)


Это неправильное использование конвейерных потоков. Они предназначены для использования разными потоками. Они не будут работать так, как вы их используете здесь, потому что есть буфер 4k и блок записи, когда он заполняется. Из Javadoc:

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

Лично я никогда не сталкивался с допустимым использованием этих конвейерных потоков с мая 1997 года. Я использовал один раз тогда и сразу же отказался от него в пользу очереди.

person user207421    schedule 08.01.2014