2010-11-19 18 views
1

Çıktı Akışları bağımlılıkları için bir InputStream analiz analizörü sınıfları listesi, bir kaç şey değiştirir ve bir OutputStream yazmak:Boru veya Takas Giriş/Java

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

analiz gibi zincire edilmelidir:

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

Şimdi içinde nihai bir ortamda çalışıyorum.

  1. Akışları "zincirlemek" için daha iyi bir yol var mı?
  2. ByteArrayInputStream ile "swap" işlemi "out" konumundan "in" konumuna mı?
  3. "İçinde" sorulu sonuç nasıl çözülür?

cevap

1
  1. kullanımı yardımcı lifler ve java.io.PipedInputStream/java.io.PipedOutputStream çiftleri.
  2. Muhtemelen büyük akışlarda iyi performans göstermeyecektir.
  3. başka cevaben söylenir gibi, dere boru aslında, çünkü 1. uygulayarak yaklaşık 2 endişelenmenize gerek kalmamasıdır zincirleme

Not yapmak için yerel olmayan nihai değişken kullanın .

1

soruya 2.
ben ByteArrayInputStream en ve ByteArrayOutputStream en tampon doğrudan erişimi olan kendi alt sınıf sağlayacaktır. Bu sayede, toByteArray numaralı telefondan ekstra kopya yaparak, hafızayı ve zamanı belemezsiniz. Söz 3.
yerel olmayan nihai değişkene atayın için

,

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

olsa dikkat orijinal in artık geçerli olacağı (Bu son lardan olacak akış)

+0

Bu bir çözüm gibi daha fazla hissediyor. Akışı yönetmek için borular gibi daha iyi çözümler var mı? –