Existe uma maneira concisa de criar um InputSupplier para um InputStream no Google Guava?
Pergunta
Existem alguns métodos de fábrica no Google Guava para criar InputSuppliers, por exemplo.a partir de um byte[]
:
ByteStreams.newInputStreamSupplier(bytes);
Ou de um File
:
Files.newInputStreamSupplier(file);
Existe uma maneira semelhante para criar um InputSupplier
para um dado InputStream
?
Ou seja, uma forma mais concisa que uma classe anônima:
new InputSupplier<InputStream>() {
public InputStream getInput() throws IOException {
return inputStream;
}
};
Fundo:Eu gostaria de usar InputStreams com, por exemplo. Files.copy(...)
ou ByteStreams.equal(...)
.
Solução
Não, eu não vi nada.
Acho que você encontrou o melhor caminho.
A única alternativa é armazenar o fluxo de entrada em uma matriz de bytes ou arquivo e criar um Fornecedor com ByteStreams.newInputStreamSupplier() ou Files.newInputStreamSupplier(), mas eu desencorajaria fazer assim.
Você também pode usar
public static long copy(InputStream from, OutputStream to)
de ByteStreams
ver:fonte
Outras dicas
Não há como converter um arbitrário InputStream
em um InputSupplier<InputStream>
, porque um InputSupplier<InputStream>
é para ser um objeto que pode criar um novo, novo InputStream
toda vez que é getInput()
O método é chamado. Isso só é possível quando a fonte subjacente de bytes está disponível para reutilização; daí os métodos de fábrica que tomam um byte[]
ou File
e devolver um InputSupplier<InputStream>
.
Como sugere Dimitris, InputSupplier
refere-se à InputStream
Da mesma maneira que Iterable
refere-se à Iterator
. A classe anônima que você descreve está incorreta porque retorna o mesmo Transmita sempre getInput()
é chamado, então as invocações subsequentes retornarão um InputStream
Isso já está exausto e fechado.
Aqui está outro problema com sua classe anônima: parte da motivação para InputSupplier
é limitar a visibilidade do real InputStream
para que possa ser fechado automaticamente. Se você embrulhar um visível externamente InputStream
em um InputSupplier
e depois transmitir isso para um método de utilidade, o método de utilidade pode fechar seu InputStream
. Você pode estar bem com isso, mas esse não é um padrão de uso limpo que a goiaba gostaria de promover.
Quando me vi querendo fazer a mesma coisa, percebi que estava fazendo isso para trás. Em vez de fazer isso:
Files.copy(InputSupplier.of(inputStream), destinationFile);
(não existe), eu deveria estar fazendo isso:
ByteStreams.copy(inputStream, Files.newOutputStreamSupplier(destinationFile));
Você está procurando algo como Strbl, certo?Tente memmem (3) .