Java 使用多个PipedInputStreams和PipedOutStreams
我使用PipedInputStream&PipedOuputStream将一个大型XML文档写入一个OutputStream,然后需要从一个InputStream中使用它 对于简单的单流输出/单流输入场景,我可以这样做,但是我需要循环一组非常大的产品,为每个产品编写两个稍微不同的项目,流到两个不同的文件中 以下psuedocode显示了我尝试采用的实现此需求的方法:Java 使用多个PipedInputStreams和PipedOutStreams,java,inputstream,pipe,outputstream,Java,Inputstream,Pipe,Outputstream,我使用PipedInputStream&PipedOuputStream将一个大型XML文档写入一个OutputStream,然后需要从一个InputStream中使用它 对于简单的单流输出/单流输入场景,我可以这样做,但是我需要循环一组非常大的产品,为每个产品编写两个稍微不同的项目,流到两个不同的文件中 以下psuedocode显示了我尝试采用的实现此需求的方法: PipedInputStream is1 = new PipedInputStream(); PipedInputStream i
PipedInputStream is1 = new PipedInputStream();
PipedInputStream is2 = new PipedInputStream();
PipedOutputStream os1 = new PipedOutputStream(is1);
PipedOutputStream os2 = new PipedOutputStream(is2);
new Thread(new Runnable(){
public void run(){
try {
XMLStreamWriter xmlWriter1 = createXMLStreamWriter(os1);
// Write header content with xmlWriter1
XMLStreamWriter xmlWriter2 = createXMLStreamWriter(os2);
// Write header content with xmlWriter2
for (Product product : someProducts) {
// marshal item for product to xmlWriter1
// marshal item for product to xmlWriter2
}
// Writer footer, close & flush with xmlWriter1
// Writer footer, close & flush with xmlWriter2
} finally {
// Additional try/catch excluded for simplicity
os1.close();
os2.close();
}
}
}).start();
// Consume is1
// Consume is2
如前所述,这对于一个PipedInputStream/PipedOutputStream很好,但是对于上面所示的两个PipedInputStream,它似乎只在写入低于特定大小的内容时起作用。当内容超过一定大小时,在编写第二个XML文档的结束元素时,它将挂起
你知道为什么会发生这种情况,以及解决方案是什么吗?上述方法可行吗?可能是资源浪费。您需要并行处理这两个文件吗?它们不能按顺序处理吗?这两个并行处理的原因是,我可以在页面中从数据库中检索产品,在产品列表中循环一次以生成文件。未来可能需要生成2个以上的文件,每个文件都有很多常见的产品数据,只有很小的差异,这似乎是最有效的方法。我从数据库中检索产品的页面意味着你正在批量进行数据库检索?如果是的话,很好。您是否经常尝试刷新XMLStreamWriter,例如在每次db批处理之后?谢谢-建议不错。不幸的是,这似乎没有什么帮助。我唯一能建议的是等待它挂起,暂停卡住的线程,看看它在等待什么。还要注意CPU和磁头的使用情况——后者可以在jconsole中完成,并查看您的资源利用率。