Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用多个PipedInputStreams和PipedOutStreams_Java_Inputstream_Pipe_Outputstream - Fatal编程技术网

Java 使用多个PipedInputStreams和PipedOutStreams

Java 使用多个PipedInputStreams和PipedOutStreams,java,inputstream,pipe,outputstream,Java,Inputstream,Pipe,Outputstream,我使用PipedInputStream&PipedOuputStream将一个大型XML文档写入一个OutputStream,然后需要从一个InputStream中使用它 对于简单的单流输出/单流输入场景,我可以这样做,但是我需要循环一组非常大的产品,为每个产品编写两个稍微不同的项目,流到两个不同的文件中 以下psuedocode显示了我尝试采用的实现此需求的方法: PipedInputStream is1 = new PipedInputStream(); PipedInputStream i

我使用PipedInputStream&PipedOuputStream将一个大型XML文档写入一个OutputStream,然后需要从一个InputStream中使用它

对于简单的单流输出/单流输入场景,我可以这样做,但是我需要循环一组非常大的产品,为每个产品编写两个稍微不同的项目,流到两个不同的文件中

以下psuedocode显示了我尝试采用的实现此需求的方法:

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中完成,并查看您的资源利用率。