___ qstnhdr ___ Speicherabgebildete Dateien in Java
___ antwort1023322 ___
Es ist immer gut, die Räder nicht neu zu erfinden.
Apache bietet eine schöne Bibliothek für die Durchführung von I / O-Operationen. Sehen Sie sich Ссылка
an
Hier ist das Szenario, dem es dient. Angenommen, Sie haben einige Daten, die Sie hätten
lieber im Gedächtnis behalten, aber Sie wissen nicht im Voraus, wie viele Daten
da wird ... sein. Wenn es zu viel ist, möchten Sie es auf die Festplatte schreiben
anstatt Speicher zu verschwenden, aber Sie wollen erst auf die Festplatte schreiben
muss, weil die Festplatte langsam ist und eine Ressource ist, die verfolgt werden muss
Aufräumen.
Sie erstellen also einen temporären Puffer und beginnen damit zu schreiben. Wenn / wann du
Erreichen Sie die Schwelle für das, was Sie im Speicher behalten möchten, müssen Sie
Erstellen Sie eine Datei, schreiben Sie heraus, was sich im Puffer dieser Datei befindet, und schreiben Sie alles
nachfolgende Daten in die Datei anstelle des Puffers.
Das macht DeferredOutputStream für Sie. Es verbirgt all das Durcheinander
um den Zeitpunkt der Umschaltung herum. Alles, was Sie tun müssen, ist das Erstellen der
deferred Stream an erster Stelle, konfigurieren Sie den Schwellenwert und dann einfach
schreibe weg nach deinem Herzen.
EDIT: Ich habe gerade eine kleine Suche mit Google durchgeführt und diesen Link gefunden:
Ссылка
(Blitzschnelle Datei lesen / schreiben). Sehr beeindruckend.
___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen.
___ answer1023303 ___
Die Verwendung der Funktion ByteBuffer.wrap () verursacht keine hohe Belastung. Es weist ein einfaches Objekt zu und initialisiert ein paar ganze Zahlen. Das Schreiben Ihres Algorithmus gegen ByteBuffer ist daher Ihre beste Wahl, wenn Sie mit Nur-Lese-Dateien arbeiten müssen.
___ qstntxt ___
Ich habe versucht, einen sehr schnellen Java-Code zu schreiben, der viele I / O-Operationen ausführen muss. Ich verwende eine Memory-Mapped-Datei, die einen ByteBuffer zurückgibt:
%Vor%
Das Problem, das ich habe, ist, dass die Methode ByteBuffer .array () (die ein byte [] -Array zurückgeben soll) nicht für schreibgeschützte Dateien funktioniert. Ich möchte meinen Code so schreiben, dass er sowohl mit im Speicher konstruierten Speicherpuffern als auch mit von der Platte gelesenen Puffern funktioniert. Aber ich möchte nicht alle meine Puffer eine ByteBuffer.wrap () - Funktion einpacken, weil ich befürchte, dass dies die Dinge verlangsamen wird. Also habe ich zwei Versionen von allem geschrieben, eine, die ein Byte [], die andere einen ByteBuffer braucht.
Sollte ich einfach alles einpacken? Oder sollte ich alles doppelt schreiben?
___ tag123memorymapping ___ Eine Technik, bei der Computer-Peripheriegeräte angesprochen werden können, als ob sie Teil des Hauptspeichers des Computers wären
___ answer1023304 ___
Wrapping byte [] wird die Dinge nicht verlangsamen ... es wird keine riesigen Array-Kopien oder andere kleine Performance-Übeln geben. Von den JavaDocs: java.nio .ByteBuffer
.wrap ()
Bringt ein Byte-Array in einen Puffer.
Der neue Puffer wird durch das angegebene Byte-Array unterstützt;
Änderungen am Puffer verursachen
das Array geändert werden und umgekehrt
versa. Die Kapazität des neuen Puffers und
Limit wird array.length sein
Position wird Null sein und seine Marke
wird undefiniert sein. Sein Hintergrund-Array
wird das gegebene Array und sein Array sein
Offset ist Null.
___ answer1133799 ___
Hat jemand tatsächlich nachgesehen, ob %code% , das von der Speicherzuordnungsunterstützung erstellt wurde, anfänglich %code% aufruft, unabhängig von readonly / readwrite?
Von meinem Herumstöbern ist die Antwort, soweit ich das beurteilen kann, NEIN . A %code% 's Fähigkeit, ein direktes %code% Array über %code% zurückzugeben, wird durch das Vorhandensein von %code% ( %code% ) ausgelöst, das immer auf null gesetzt wird, wenn ein %code% erstellt wird.
Was mich irgendwie nervt, weil ich gehofft hatte, etwas Ähnliches zu tun, was der Fragesteller machen wollte.
___