Могу ли я закрыть / снова открыть InputStream для имитации метки / сброса для входных потоков, которые не поддерживают метку? - PullRequest
3 голосов
/ 13 апреля 2011

Я пытаюсь прочитать java.io.InputStream несколько раз, начиная с вершины потока.

Очевидно, что для потоков, которые возвращают true в markSupported(), я могу попробовать использовать mark(availableBytes), а затем reset(), чтобы снова прочитать поток сверху.

Большинство потоков не поддерживают метки, а те, которые (например, java.io.BufferedInputStream), копируют данные во временный байтовый массив, что не очень хорошо с точки зрения потребления памяти и т. Д.

Если мой метод получает java.io.InputStream в качестве параметра, могу ли я закрыть его, а затем каким-то образом снова открыть, чтобы сбросить тот же исходный поток наверх, чтобы я мог прочитать его снова?

Я не смог найти никакого способа сделать этот трюк, кроме записи оригинального InputStream в память (як!) Или временного файла и открытия нового InputStream во эти временные местоположения, если мне нужно снова прочитать поток сверху .

1 Ответ

3 голосов
/ 13 апреля 2011

Вы можете закрыть его, но единственный способ открыть тот же поток для тех же данных без создания где-либо явной копии данных - это определить, с каким конкретным типом InputStream вы имеете дело (легко), что этопоток был инициализирован для указания (может быть простым, сложным или невозможным в зависимости от типа потока и его интерфейса), а затем добавлен код для создания экземпляра нового типа конкретного потока с исходным исходным вводом (не сложно, но такжене очень удобен в обслуживании и легко ломается, если кто-то создает пользовательскую реализацию InputStream, с которой вы не знаете, как обращаться).

...