2016-03-26 8 views

Antwort

1

Basierend auf den Quellcode commons-compress.jar ver 1.4,

Was passiert, wenn wir eine Instanz von TarArchiveInputStream schaffen?

Neben anderen Initialisierung die wichtige Aufgabe, die erstellt wird, ist eine Instanz TarBuffer Objekt, das intern hat ein byte[] blockBuffer deren Standardgröße ist (DEFAULT_RCDSIZE * 20) i..e, 512 * 20 = 10 KB.

Dieses TarBuffer Objekt führt tatsächlich die Operationen und die Daten in diesem blockBuffer von der zugrunde liegenden tar Datei liest als readblock() Methode intern aufgerufen wird, da wir die ganze gesamte Datei intern aufrufen TarArchiveInputStream.read(..)

speichert das Objekt von TarArchiveInputStream in den Heapspeicher?

Nein In der Tat, in der Regel, wenn wir die Leseverfahren eines inputStream aufrufen, wenn versuchen, die Daten von Anwendungspuffer zu erhalten, wenn der Strom gepuffert. Wenn die angeforderten Daten vorhanden sind, dient es aus dem Puffer. Ist dies nicht der Fall, signalisiert es dem Betriebssystem (über Trap), die Daten aus dem Cache/Datenträger der Betriebssystemdatei zu lesen und in seinen Puffer zu kopieren. (Memory-Mapped-Dateien sind etwas anders, wo dieses Kopieren nicht nötig ist, aber wir werden das in unserer Diskussion nicht mischen).

Dies gilt auch für den Fall TarArchiveInputStream. Wie wir read Methode auf TarArchiveInputStream anrufen, delegiert es an die innere inputStream und der obige gleiche Fluss kann visualisiert werden.

Oder ist es nur ein Zeiger auf eine Datei und speichert nichts in den Speicher?

Während die TarArchiveInputStream schaffen wir eine inputStream als Argument übergeben und diese inputStream ist in der Tat, einen Zeiger (soweit ich konnte sich erinnern, ist es in Inode-Nummer in * -nix OS und zeigt auf einen tatsächlichen Inode-Struktur) zur Datei.

Es speichert den Inhalt wie zuvor beschrieben im Speicher, aber nicht die gesamte Datei. Wie viele Daten in den Speicher gelesen werden, hängt von der Größe byte[] ab, die an die While-Instanz read(...) über TarArchiveInputStream übergeben wird.

Wenn es hilft, ist dies die link, die ich verwendet habe, um zu sehen, wie Einträge mit TarArchiveInputStream zu lesen.