2016-03-26 7 views
3

Ich habe eine Klasse Sample, die zwei Konstruktoren hat. Man nimmt ein Objekt von File, während ein anderes ein InputStream nimmt.Wenn ich Objekte von InputStream im Speicher belasse, heißt das, dass ich die ganze Datei im Speicher ablege?

package org.xyz.core; 

    import java.io.File; 
    import java.io.InputStream; 

    /** 
    * Created by Ashish Pancholi on 26-03-2016. 
    */ 
    public class Sample { 

     File file; 

     public Sample(File file){ 
      this.file=file; 
     } 

     public Sample(InputStream inputStream){ 
      this.file = createFileFromInputStream(inputStream); 
     } 
    } 

Und ich bin mit LinkedBlockingQueue, die ein Objekt der Probe verbraucht und hat eine Tiefe von 10000;

BlockingQueue<String> queue = new LinkedBlockingQueue<Sample>(10000); 

Lass sich hier zwei Fälle annehmen:

Fall A: ich so viele Instanzen von Sample Klasse initialisieren, indem InputStream als ein Argument zu übergeben und ich schob all diese Objekte in die LinkedBlockingQueue.

Fall B: ich initialisieren so viele Instanzen von Sample Klasse von File Objekt als Argument zu übergeben und ich schob all diese Objekte in die LinkedBlockingQueue.

In diesem Fall benötigt mein Programm mehr Speicher? Wenn ich Objekte von InputStream im Speicher belasse, heißt das, dass ich die gesamte Datei im Speicher ablege? Was ist, wenn ich so viele große Dateien habe?

Aktualisiert:

Bitte beachten Sie: Ich bin die InputStream durch diese Art und Weise zu schaffen:

InputStream is = new TarArchiveInputStream(new GZIPInputStream(new BufferedInputStream(new FileInputStream(file)))); 
+0

@AshishPancholi Auf welche Unterklasse von 'Inputstream' beziehen Sie sich? –

+0

Es ist unklug, 'InputStream' als ein Feld zu speichern; Wer ist dafür verantwortlich, sie zu schließen? Wie können Sie garantieren, dass sie offen bleiben? Aber solange Sie keine Dateien in einem 'ByteArrayInputStream' lesen, spielt der Speicher keine Rolle. –

+0

@MadhusudanaReddySunnapu jeder von ihnen, sicherlich. Ist das nicht der Punkt der Abstraktion? –

Antwort

3

Es hängt davon ab.

Ein InputStream kann gepuffert oder nicht gepuffert werden, es könnte die gesamte Datei intern oder nichts speichern, es ist frei, all dies zu tun. Möglicherweise sind ihnen sogar native Ressourcen zugeordnet.

Es gibt jedoch ein grundsätzlicheres Problem mit diesem Muster: InputStream s machen nur wirklich Sinn als Teil eines Prozesses, der sie liest. Speichern Sie sie in Masse ist eine schlechte Idee, weil:

  1. Sie sind nicht Thread-sicher. (Mehrere Threads von einem InputStream Lesen wird fast immer in Tränen enden.)
  2. Wenn wir über FileInputStream s sprechen, werden sie die Datei geöffnet halten und Sie können keine Dateideskriptoren ausgehen.
+0

Genau, 'InputStream' als Feld zu speichern ist ein Fehler Idea TM aus verschiedenen Gründen. Erinnerung ist wahrscheinlich ein vorübergehendes Problem. –

+0

Ich habe meine Frage aktualisiert und versuche zu verstehen, dass 'InputStream', das ich verwende, gepuffert oder nicht gepuffert ist? Es kommt auf diese Weise: 'InputStream ist = neuer TarArchiveInputStream (neuer GZIPInputStream (neuer BufferedInputStream (neuer FileInputStream (Datei)));' –

+0

@AshishPancholi diese Antwort hält noch an - "InputStream" nicht als Feld speichernd. –