Я думаю, вы пытаетесь использовать его неправильно ...
из 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
Существует способ использования временного потока, в котором вы можете сделать что-то похожее на исходное решение и потоковые потоки.