Тестирование на пустой InputStream в Java - PullRequest
7 голосов
/ 31 марта 2011

как вы, ребята, проверяете наличие пустого InputStream? Я знаю, что InputStream предназначен для работы с удаленными ресурсами, поэтому вы не сможете узнать, есть ли он там, пока не прочитаете его. Я не могу использовать read (), потому что текущая позиция изменится, и использование mark () и сброс для этого кажется неуместным.

Проблема в том, что иногда невозможно проверить, если read () возвращает -1, потому что, если у вас есть поток и какая-то сторонняя библиотека использует его, вам нужно проверить, является ли он пустым, прежде чем отправлять его туда.

Под пустыми InputStreams я подразумеваю эти new ByteArrayInputStream(new byte[0])

Ответы [ 3 ]

13 голосов
/ 31 марта 2011

Вы можете заключить ваш InputStream в PushbackInputStream . Этот класс будет хранить первые несколько байтов из read() во внутреннем буфере. Позже вы можете unread() байтов и передать объект в стороннюю библиотеку.

Мне не очень нравится ByteArrayInputStream, потому что он хранит все данных из потока в памяти.

Кроме того, в любом случае вы будете вынуждены читать (), чтобы проверить наличие пустого потока, что означает, что вы попадете в сеть, по крайней мере, на несколько байтов.

5 голосов
/ 31 марта 2011

Пара альтернатив:

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

  • Если метод markSupported() возвращает true для определенного экземпляра InputStream, вы можете использовать методы mark() и reset(), чтобы вернуться к началу потока после попытки использования read() на нем.

EDIT:

Кстати, ByteArrayInputStreams поддерживают mark() и reset() довольно хорошо, и они по умолчанию отмечены в позиции 0. Этот код:

InputStream x = new ByteArrayInputStream(new String("1234567890").getBytes());

byte b[] = new byte[1];

x.read(b, 0 , 1);
System.out.println(b[0]);

x.read(b, 0 , 1);
System.out.println(b[0]);

x.reset();

x.read(b, 0 , 1);
System.out.println(b[0]);

имеет такой вывод:

49
50
49
0 голосов
/ 31 марта 2011

Будет ли у вас работать метод available() на InputStream?

...