我无法弄清楚我是否正在使用管道流,或者我的问题是否在下面的问题的其他地方。
我有一个对象(称为“adi”),我将其编组到一个文件中,如下所示:
final PipedInputStream pipedInputStream = new PipedInputStream();
OutputStream pipedOutputStream = null;
pipedOutputStream = new PipedOutputStream(pipedInputStream);
log.info("marshalling away");
final OutputStream outputStream = new FileOutputStream(new File(
"target/test.xml"));
m.marshal(adi, outputStream);
outputStream.flush();
outputStream.close();
pipedOutputStream.write("test".getBytes());
// m.marshal(adi, pipedOutputStream);
pipedOutputStream.flush();
pipedOutputStream.close();
log.info("marshalling done");
return pipedInputStream;
然而,当我取消注释时
//m.marshal(adi, pipedOutputStream);
代码永远挂起(从不显示“编组完成”),而我希望代码返回包含“test”的输入流,然后是我的编组对象。
我错过了什么?
由于
答案 0 :(得分:2)
我认为你正试图错误地使用它......
从API(http://docs.oracle.com/javase/6/docs/api/java/io/PipedInputStream.html):
通常,一个线程从PipedInputStream对象读取数据,而其他线程将数据写入相应的PipedOutputStream。建议不要尝试使用单个线程中的两个对象,因为它可能使线程死锁。
你想要做的是:
log.info("marshalling away");
final OutputStream fileOutputStream = new FileOutputStream(new File(
"target/test.xml"));
m.marshal(adi, fileOutputStream);
fileOutputStream.flush();
fileOutputStream.close();
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
outputStream.write("test".getBytes());
m.marshal(adi, outputStream);
outputStream.flush();
final InputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
outputStream.close();
log.info("marshalling done");
return inputStream;
有关如何将输出流转换为输入流的更多示例,请参阅此处:http://ostermiller.org/convert_java_outputstream_inputstream.html
有一种方法可以使用临时线程,您可以执行类似于原始解决方案和管道流的操作。