Существует несколько методов фабрики в Google Guava для создания InputSuppliers, например, от a byte[]
:
ByteStreams.newInputStreamSupplier(bytes);
Или от a File
:
Files.newInputStreamSupplier(file);
Есть ли похожий способ к создать InputSupplier
для данного InputStream
?
Таким образом, путь это более кратко, чем анонимный класс:
new InputSupplier<InputStream>() {
public InputStream getInput() throws IOException {
return inputStream;
}
};
Фон: я хотел бы использовать InputStreams с, например. Files.copy(...)
или ByteStreams.equal(...)
.
Нет, я ничего не видел.
Думаю, вы нашли лучший способ.
Единственная альтернатива, где сохранить входной поток в байтовом массиве или файле и создать поставщика с помощью ByteStreams.newInputStreamSupplier () или Files.newInputStreamSupplier (), но я бы не рекомендовал делать это.
Вы также можете использовать
public static long copy(InputStream from, OutputStream to)
из ByteStreams
см. src Это было бы так же неправильно, как обернуть Iterator в Iterable, я чувствую, что вероятность того, что такая вещь попадет в библиотеку, равна нулю. Как говорит elou, вы можете использовать метод ByteStreams.copy(), но не похоже, что есть очевидная причина делать equals() для двух потоков.
Я понимаю колебания авторов guava по поводу добавления такого (тривиального) метода - насколько распространенным может быть полное (или частичное, но без знания того, где был оставлен поток, так что впоследствии он так же непригоден для использования) чтение двух потоков только для того, чтобы посмотреть, одинаковы ли они, без какой-либо другой обработки данных? Приходят ли эти байты из источника с неповторяющимся чтением, например, из сетевого сокета? В противном случае, если это просто файл или массив байтов в памяти, есть и другие способы, позволяющие выполнить проверку на равенство.