Если все, что вы хотите сделать, это прочитать одну и ту же информацию более одного раза, а входные данные достаточно малы, чтобы поместиться в память, вы можете скопировать данные из вашего InputStream
в ByteArrayOutputStream .
Затем вы можете получить связанный массив байтов и открыть столько «клонированных» ByteArrayInputStream s, сколько захотите.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// Fake code simulating the copy
// You can generally do better with nio if you need...
// And please, unlike me, do something about the Exceptions :D
byte[] buffer = new byte[1024];
int len;
while ((len = input.read(buffer)) > -1 ) {
baos.write(buffer, 0, len);
}
baos.flush();
// Open new InputStreams using the recorded bytes
// Can be repeated as many times as you wish
InputStream is1 = new ByteArrayInputStream(baos.toByteArray());
InputStream is2 = new ByteArrayInputStream(baos.toByteArray());
Но если вам действительно нужно сохранитьисходный поток открыт для получения новых данных, затем вам нужно будет отследить этот внешний метод close()
и предотвратить его каким-либо образом вызывать.
ОБНОВЛЕНИЕ (2019):
Начиная с Java 9, средние биты можно заменить на InputStream.transferTo
:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
input.transferTo(baos);
InputStream firstClone = new ByteArrayInputStream(baos.toByteArray());
InputStream secondClone = new ByteArrayInputStream(baos.toByteArray());