使用管道流和jaxb

时间:2011-12-01 17:40:37

标签: jaxb marshalling inputstream outputstream

我无法弄清楚我是否正在使用管道流,或者我的问题是否在下面的问题的其他地方。

我有一个对象(称为“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;
  • 该代码使用我期望的内容(编组对象)生成文件target / test.xml,验证编组到outputStream中是否正常工作。
  • 该代码还会生成pipedInputStream。如果我遍历从该流中提取的字节并打印它们,它会显示“test”,验证我的输入/输出管道流已正确设置并正常工作。

然而,当我取消注释时

  //m.marshal(adi, pipedOutputStream);  

代码永远挂起(从不显示“编组完成”),而我希望代码返回包含“test”的输入流,然后是我的编组对象。

我错过了什么?

由于

1 个答案:

答案 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

有一种方法可以使用临时线程,您可以执行类似于原始解决方案和管道流的操作。