Читать часть InputStream дважды - PullRequest
1 голос
/ 13 марта 2020

У меня есть ServletInputStream, который может быть очень большим, и я хочу извлечь первые X байтов InputStream и затем позволить потоку в его начальном состоянии.

На данный момент я сделал markSupported (), mark () и reset (), но markSupported возвращает false, поэтому мне нужно реализовать другой способ сделать это.

Решение описал здесь , чтобы прочитать входной поток дважды, но проблема в том, что мой поток может быть очень большим по размеру, и у меня не может быть всего этого в памяти (более того, я не уверен, что максимальный размер массива будет достаточно).

Есть ли способ просто прочитать небольшое количество байтов и затем поставить поток в исходное состояние. Обходной путь будет состоять в том, чтобы использовать X байтов, которые я хочу прочитать, а затем разрешить потраченному потоку пройти X байтов в дополнение к следующему процессу (которого я хочу избежать).

Ответы [ 2 ]

2 голосов
/ 13 марта 2020

BufferedInputStream.markSupported() возвращает true (см. Javado c). Просто оберните ваш поток с BufferedInputStream и установите предел отметки больше, чем X.

0 голосов
/ 13 марта 2020

Вы смотрели на java.io.PushbackInputStream?

Если я правильно вас понимаю, это похоже на то, что вы хотите достичь, особенно если байты, которые вы хотите исследовать, находятся в начале поток.

byte[] peekBuffer = new byte[n];
PushbackInputStream pis = new PushbackInputStream(yourStream, peekBuffer.length);

pis.read(peekBuffer);
// Examine peekBuffer

// Reinsert the peeked bytes.
pis.unread(peekBuffer);
...