У меня есть OutputStream, из которого мне нужно было прочитать, поэтому я использовал следующий (Groovy) код для получения ссылки InputStream на данные:
PipedInputStream inputStream = new PipedInputStream()
PipedOutputStream outputStream = new PipedOutputStream(inputStream)
new Thread(
new Runnable() {
public void run() {
// Some API method
putDataInOutputStream(outputStream)
outputStream.close()
}
}
).start()
handler.process(inputStream)
В этом случае обработчик - это некоторый класс, который реализует интерфейс, который имеет этот метод:
public void process(InputStream stream);
Проблема, которая возникла в наших новых требованиях, заключалась в том, что в потоке была некоторая предварительная обработка, и поэтому мне нужно прочитать поток как минимум дважды в методе handler.process (). Вот пример кода из одной реализации:
public void process(InputStream stream) {
def bufferedStream = new BufferedInputStream(stream, 30 * 1048576) // 30 MB
bufferedStream.mark(Integer.MAX_VALUE)
parseMetadata(bufferedStream)
bufferedStream.reset()
doTheThingYouDo(bufferedStream)
}
Я знаю, что для некоторых входных данных я не достигаю предела 30 МБ или размера буфера Integer.MAX_VALUE . Однако я всегда получаю следующее исключение:
java.io.IOException: Stream closed
Это вообще возможно? Я думаю, что проблема заключается в закрытии потока в PipedOutputStream, но я не знаю, как это предотвратить или, возможно, я создаю больше проблем, будучи новичком в Java Stream IO.