Existe uma maneira concisa de criar um InputSupplier para um InputStream no Google Guava?

StackOverflow https://stackoverflow.com/questions/2363408

  •  23-09-2019
  •  | 
  •  

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(...).

Foi útil?

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) .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top