用Java管道或交换输入/输出流

时间:2010-11-19 14:10:09

标签: java multithreading inputstream swap outputstream

分析器类的列表,用于分析InputStream的依赖关系,更改一些内容并将其写入OutputStream:

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

分析仪应链接为:

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

现在我正在 in 的最终环境中工作。

  1. 有没有更好的方法来“链接”流?
  2. 使用ByteArrayInputStream从“out”到“in”的“swap”操作是否昂贵?
  3. 如何处理“in”最终的问题?

2 个答案:

答案 0 :(得分: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将不再有效(它将位于流末尾)

答案 1 :(得分:1)

  1. 使用辅助线程和java.io.PipedInputStream / java.io.PipedOutputStream对。
  2. 可能它在大流量上表现不佳。
  3. 正如在另一个回复中所说,使用本地非最终变量来进行链接
  4. 请注意,通过应用1.您不需要担心2,因为您实际上正在管理流。