2016-07-13 12 views
0

Betrachten Sie das folgende Code-Snippet getInputStreamForRead() Methode erstellt und gibt einen neuen Eingabestream zum Lesen.Wiederverwendung der Eingabe Stream-Variable

InputStream is = getInputStreamForRead(); //This method creates and returns an input stream for file read 
is = getDecompressedStream(is); 

Da der ursprüngliche Dateiinhalt komprimiert und gespeichert wird, muss er beim Lesen dekomprimiert werden. Daher getDecompressedStream() Methode unten würde Option bieten dem Strominhalt

public InputStream getDecompressedStream(InputStream is) throws Exception { 
return new GZIPInputStream(is); 
} 

haben folgendes bezweifelt

  1. zu dekomprimieren Welche eine richtige für das obige Snippet ist

    is = getDecompressedStream(is) 
    

    oder

    InputStream newStream = getDecompressedStream(is) 
    
  2. Wird die InputStream Variable erneut verwendet, um Probleme zu verursachen?

Ich bin komplett neu mit Streams. Bitte helfen Sie mir, dies zu wissen.

+0

Ich glaube, Inputstream ist nur ein anderes Objekt und es wird mit neuen Wert neu zugewiesen. 1 sollte in Ordnung sein. – SomeDude

+0

Sie könnten dies selbst testen, indem Sie es versuchen. Aber sie werden beide dasselbe tun. Beide sind gültige Optionen. – Adam

+0

Kann ich eine ähnliche Stream-Instanz wie eine Klasseninstanz annehmen/verstehen? Oder hat die Stream-Instanz irgendwelche Ausnahmen? – lsof

Antwort

1

Solange:

  • Sie nicht die ursprüngliche InputStream zwischen der ursprünglichen Zuordnung zu manipulieren und den neuen Aufruf
  • Sie schließen immer Ihre Streams in einer finally Anweisung

... sollten Sie die ursprüngliche Variable neu zuweisen - es ist nur ein neuer Wert, der an eine vorhandene Referenz übergeben wird.

In der Tat, dass der empfohlene Weg sein kann, da Sie nur in der Nähe eines Closeable programmatisch erhalten, wie GZIPInputStream#close ...

Schließt diesen Eingangsstrom und gibt alle Systemressourcen mit dem Strom verbunden.

(siehe here - Ich las dies als, "schließt den zugrunde liegenden Stream").

1

Da Sie den Eingabestream korrekt schließen möchten, erstellen Sie den Eingabestream am besten über Verkettung und verwenden Sie eine Try-with-Resources, um die Eingabe für Sie zu verarbeiten.

try (InputStream is = getDecompressedStream(getInputStreamForRead())) { 
    // code using stream here 
} 
+0

Ja @Andreas Es scheint eine gute Option zum Schließen des Eingabestroms zu sein. Aber ich würde gerne wissen, ob der Eingabestrom wiederverwendet werden kann. dh; Ob die 'InputStream'-Instanz mit einem anderen Wert neu zugewiesen wird, würde Probleme verursachen. – lsof

+0

Für ein Beispiel kann der Wert einer endgültigen Variablen nicht geändert werden.Ebenso kann es für eine 'InputStream'-Instanzvariable bei der Wiederverwendung/Neuzuweisung zu Problemen kommen. – lsof

+1

@RajasubaSubramanian Sie Kommentare sind verwirrend, also lassen Sie mich so antworten: 1) Eine Variable kann wiederverwendet werden, Sie verlieren nur den vorherigen Wert, wenn Sie neu zuweisen. Wenn Sie diesen Wert nicht mehr benötigen, gibt es kein Problem. 2) Ein 'InputStream' kann nicht wiederverwendet werden. Sie können den Stream nur einmal lesen. – Andreas

Verwandte Themen