C'è un modo conciso per creare un InputSupplier per un InputStream in Google Guava?

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

  •  23-09-2019
  •  | 
  •  

Domanda

Ci sono alcuni metodi di fabbrica di Google Guava per creare InputSuppliers, per esempio da un byte[]:

ByteStreams.newInputStreamSupplier(bytes);

o da un File:

Files.newInputStreamSupplier(file);

C'è un modo simile a quello di creare un InputSupplier per un dato InputStream?

Cioè, un modo che è più conciso di una classe anonima:

new InputSupplier<InputStream>() {
    public InputStream getInput() throws IOException {
        return inputStream;
    }
};

Sfondo: Vorrei utilizzare InputStreams con per esempio Files.copy(...) o ByteStreams.equal(...).

È stato utile?

Soluzione

niente No, non l'ho visto.
Credo di aver trovato il modo migliore.
L'unica alternativa in cui memorizzare l'InputStream in un array di byte o di un file e creare un fornitore con ByteStreams.newInputStreamSupplier () o Files.newInputStreamSupplier (), ma scoraggerebbe a fare così.
Si potrebbe anche usare

public static long copy(InputStream from, OutputStream to)
da
ByteStreams
vedi: src

Altri suggerimenti

Non c'è alcun modo per convertire un InputStream arbitraria in un InputSupplier<InputStream>, perché un InputSupplier<InputStream> si suppone che sia un oggetto che può creare un fresco, nuovo InputStream ogni volta che il suo metodo getInput() viene chiamato. Questo è possibile solo quando la sorgente sottostante di byte è disponibile per il riutilizzo; quindi i metodi factory che prendono un byte[] o File e restituiscono un InputSupplier<InputStream>.

Come suggerisce Dimitris, InputSupplier riferisce alla InputStream nello stesso modo in cui Iterable riferisce a Iterator. La classe anonima che descrivi non è corretto perché restituisce il stesso lo streaming ogni volta getInput() è chiamato, in modo da invocazioni successive restituirà un InputStream che è già esaurita e chiusa.

Ecco un altro problema con il classe anonima: una parte della motivazione per InputSupplier è quello di limitare la visibilità del InputStream reale in modo che possa essere chiusa automaticamente. Se si avvolgono un InputStream esternamente visibile in un InputSupplier e poi passate che in un metodo di utilità, il metodo di utilità può chiudere il InputStream. Si potrebbe essere d'accordo con questo, ma che non è un modello di utilizzo pulito che Guava vorrebbe promuovere.

Quando mi sono trovato a voler fare la stessa cosa, mi sono reso conto che stavo facendo all'indietro. Invece di fare questo:

Files.copy(InputSupplier.of(inputStream), destinationFile);

(non esiste), che dovrebbe invece essere facendo questo:

ByteStreams.copy(inputStream, Files.newOutputStreamSupplier(destinationFile));

Che sarebbe così sbagliato come avvolgere un iteratore ad un Iterable, mi sembra che c'è come pari a zero probabilità di una cosa del genere che va in biblioteca. Come elou dice, è possibile utilizzare il metodo ByteStreams.copy (), ma non sembra essere una ragione più ovvia da fare equals () in due flussi.

Capisco autori guava esitazione per aggiungere ad un metodo (banale) - come comune può essere quello di totalmente (o parzialmente, ma senza sapere dove il torrente è stato lasciato, quindi è buono come inutilizzabile in seguito) leggere due flussi solo per vedere se sono gli stessi, senza alcun altro trattamento dei dati? Fare questi byte provengono da una fonte non ripetibile-lettura, come una presa di rete? In caso contrario, se è solo un posto di file, o un array di byte in memoria, ci sono altri modi che si prestano a fare un test di uguaglianza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top