2010-11-19 6 views
1

список классов анализатора, анализирующих в InputStream для зависимостей, изменяет несколько вещей и записать его в OutputStream:трубы или Своп ввода/вывода Потоки в Java

public Set<Dependency> analyse(InputStream i, OutputStream o); 

анализаторы должны быть прикованным как:

for(DocumentAnalyser analyser : a) { 
o.getDependencies().addAll(analyser.analyse(in, out)); 
in = new ByteArrayInputStream(out.toByteArray()); 
} 

Сейчас я работаю в среде, где в является окончательным.

  1. Есть ли лучший способ «перестроить» потоки?
  2. Операция «swap» от «out» до «in» с ByteArrayInputStream дорогая?
  3. Как бороться с проблемой, что окончание?

ответ

1
  1. Использование вспомогательных потоков и java.io.PipedInputStream/java.io.PipedOutputStream пар.
  2. Вероятно, он не будет хорошо работать на больших потоках.
  3. Как сказано в другом ответе использовать локальный неконечное переменную сделать цепное

Обратите внимание, что путем применения 1. Вам не нужно беспокоиться о том 2, потому что вы на самом деле конвейеру потоки ,

1

На вопрос 2.
я бы предоставить свой собственный подкласс, который имеет прямой доступ к буфера ByteArrayInputStream в и ByteArrayOutputStream в. Таким образом, вы не будете таить память и время, сделав дополнительную копию в toByteArray.

На вопрос 3.
Назначают его к локальной неконечное переменной,

InputStream nonFinalIn = in; 
for(DocumentAnalyser analyser : a) { 
o.getDependencies().addAll(analyser.analyse(nonFinalIn, out)); 
nonFinalIn = new ByteArrayInputStream(out.toByteArray()); 
} 

Остерегайтесь, однако, что первоначальный in больше не будет иметь силу (это будет в конце-of поток)

+0

Это больше похоже на обходной путь. Есть ли лучшие решения, такие как трубы для обработки Stream? –