Использование потоковых каналов и jaxb - PullRequest
1 голос
/ 01 декабря 2011

Я не могу понять, неправильно ли я использую потоковые каналы или моя проблема в другом месте проблемы ниже.

У меня есть объект (называемый '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. Если я перебираю байты, извлеченные из этого потока, и печатаю их, отображается «тест», подтверждающий тот факт, что мой поток ввода-вывода правильно настроен и работает.

1 Ответ

2 голосов
/ 01 декабря 2011

Я думаю, вы пытаетесь использовать его неправильно ...

из 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

Существует способ использования временного потока, в котором вы можете сделать что-то похожее на исходное решение и потоковые потоки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...