2010-11-19 44 views
1

Une liste des classes d'analyse qui analysent un InputStream pour les dépendances, les changements quelques petites choses et d'écrire à un OutputStream:pipe ou Swap entrée/flux de sortie en Java

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

Les analyseurs doivent être enchaînées comme:

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

maintenant, je travaille dans un environnement où en est définitive. Y a-t-il une meilleure façon de "chaîner" les flux?

  1. L'opération "swap" de "out" à "in" avec ByteArrayInputStream est-elle coûteuse?
  2. Comment faire face au problème que "in" est définitif?

Répondre

1
  1. Utilisez des threads auxiliaires et des java.io.PipedInputStream/java.io.PipedOutputStream paires.
  2. Probablement, il ne fonctionnera pas bien sur les gros flux.
  3. Comme il est dit dans une autre réponse, utilisez une variable non finale locale pour faire le enchaînant

Notez que par l'application 1. vous n'avez pas à vous soucier de 2 parce que vous êtes en fait canalisant les flux .

1

Pour la question 2.
Je fournirais ma sous-classe qui a un accès direct à la mémoire tampon de ByteArrayInputStream et ByteArrayOutputStream. De cette façon, vous n'avez pas la mémoire de la taille et le temps en faisant des copies supplémentaires dans toByteArray.

Pour la question 3.
assigner à une variable non finale locale,

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

Prenez garde, cependant, que le in ne sera plus valide d'origine (il sera à la fin de carrière flux)

+0

Cela ressemble plus à une solution de contournement. Y a-t-il de meilleures solutions comme des tuyaux pour gérer le Stream? –