Alles, was Sie über Java File IO und Serialisierung wissen müssen

Serialisierung ist ein Prozess, der es Ihnen ermöglicht, Java-Objekte zu speichern und abzurufen. Sie müssen Serialisierung und Datei-E/A beherrschen, um Objekte auf einer Festplatte oder einem USB-Laufwerk zu speichern oder Objekte über ein Netzwerk freizugeben. Hier erfahren Sie, was Sie über Java-Datei-I/O und Serialisierung wissen müssen.

Java-Objekte und Serialisierung

In Java ist ein Objekt ein Element mit einem Wert. Sie können es an jeder Stelle Ihres Codes mit einem Bezeichner aufrufen. Objekte können Funktionen, Methoden, Datenstrukturen oder Variablen sein.

Objekte werden in Klassen organisiert. Der Zweck einer Klasse besteht darin, zu definieren, welche Parameter das Objekt enthält und wie es sich verhalten soll.

Beim Aufrufen eines Objekts wird eine bestimmte Methode oder Funktion ausgeführt. Durch die Serialisierung kann das Verhalten eines Objekts beibehalten werden, wenn es gespeichert oder geteilt wird.

Objekte müssen als Bytestrom gespeichert werden. Dieser Stream enthält Typinformationen, den Typ des mit dem Objekt verknüpften Dateninhalts und die mit dem Objekt verknüpften Werte. Diese Informationen werden in einem Bytestrom serialisiert, auf einem Gerät gespeichert oder über ein Netzwerk gesendet, und das Objekt wird durch einen Prozess namens Deserialisierung neu erstellt.

In gewisser Weise bereitet die Serialisierung Daten so vor, dass sie dank des I/O-Mechanismus gemeinsam genutzt werden können. Der I/O-Mechanismus an sich ermöglicht es Ihnen, Datenströme zwischen Programmen und Maschinen zu generieren, aber diese Daten wären nutzlos, wenn sie während des Serialisierungsprozesses nicht korrekt formatiert würden.

Was ist Datei-E/A in Java?

I/O steht für Input/Output. Die Datei-E/A bezieht sich auf die Eingabe- und Ausgabeströme, die Programmierer zum Lesen und Schreiben von Daten bei der Arbeit mit Java verwenden können.

Diese Streams werden häufig verwendet, um Daten zwischen Programmen auszutauschen, die auf demselben Computer ausgeführt werden, um Daten über ein Netzwerk zu senden oder einfach um Dateien auf E/A-Geräten zu speichern. Abhängig von der Größe der Datenpakete und dem für diese Aktion verfügbaren CPU-Speicher ist es wichtig, die richtige Art von Datenströmen auszuwählen.

Diese Streams gehören zum Paket java.io. Dieses Paket enthält die Klassen, die zum Teilen von Daten zwischen Anwendungen und zum Speichern von Daten in einer Anwendung erforderlich sind E/A-Gerät. Ein E/A-Gerät kann eine Festplatte, ein USB-Stick, eine CD-ROM usw. sein.

In der Java-Programmierung ist ein Stream ein Objekt, das die gemeinsame Nutzung eines Datenflusses ermöglicht. Dieser Datenfluss kann entweder an ein Gerät gesendet oder von Programmen gemeinsam genutzt werden. Der Zweck eines Eingabestreams besteht darin, Daten zu lesen, während ein Ausgabestream Daten schreibt.

Es gibt verschiedene Arten von I/O-Streams. Java-Byte-Streams werden zum Teilen von Daten im 8-Bit-Format verwendet, während Java-Zeichenstreams das Speichern und Teilen von 16-Bit-Unicode ermöglichen. Zum Speichern oder Freigeben einer Textdatei müssten Sie einen Zeichenstrom verwenden, während ein Bite-Stream praktischer wäre, wenn Sie mit Binärdateien arbeiten.

In Java werden Daten in binärer Form gespeichert. Ganzzahlen werden in einem 4-Byte-Format gespeichert, während Zeichenfolgen in einem 16-Bit-Format gespeichert werden. Durch die Verwendung binärer Formen werden Java-Codedateien kleiner als in ASCII-Formaten gespeicherte Textdateien. Dies bedeutet jedoch, dass Sie zum Speichern und Teilen dieser Daten eine Methode namens Serialisierung verwenden müssen.

Dies sind die verschiedenen E/A-Streams, die Sie kennen müssen.

Byte-Streams

Die beiden Byte-Streams werden aufgerufen ObjectInputStream Und ObjectOutputStream. Die Methoden bekannt als readObject Und writeObject sind mit diesen Streams verbunden.

Die Verwendung eines Byte-Streams eignet sich, wenn Sie mit Rohdaten arbeiten. Diese Streams funktionieren jedoch nicht, wenn die Daten nicht binär sind.

Charakter-Streams

FileInputStream Und FileOutputStream sind die Streams, die für 16-Bit-Unicode verwendet werden. Der FileReader Und FileWriter Klassen sind diesen Streams zugeordnet.

Dies sind die Streams, die Sie für die meisten Anwendungen verwenden werden, da sie nicht auf rohe Binärdaten beschränkt sind.

Standard-Streams

Das java.io-Paket enthält weitere Streams, die Sie möglicherweise verwenden müssen. System.in ist ein Stream, der zum Senden von Daten an ein Programm verwendet wird. Die Eingabe der Daten erfolgt über eine Tastatur.

System.out ist der Stream, der eine Datenausgabe von einem Programm generiert und diese Daten an den Computermonitor sendet.

System.fehler ist der Stream, der Fehlerdaten an den Computermonitor ausgibt. Der system.out Und system.err Streams enthalten eine integrierte Methode namens printIn(). Mit dieser Methode können Sie Daten zu diesen Streams hinzufügen.

Gepufferte Streams

Es gibt zwei E/A-Streams, die so konzipiert sind, dass sie mehr CPU verbrauchen als andere Streams. Der BufferedReader Und BufferedWriter Klassen verbrauchen weniger Buff-Speicher und helfen Ihnen, Zeit zu sparen.

Auf der anderen Seite müssen die Streams, die große Mengen an Pufferspeicher benötigen, jeden Aufruf einer Methode in Bytes konvertieren. Sobald alles verarbeitet wurde, werden die Informationen in eine Datei geschrieben.

Die Verwendung dieser Streams kann bei der Arbeit mit großen Dateien einen Unterschied machen.

Wie funktioniert Serialisierung?

Java-Serialisierung

Bildnachweis an Java-Entwicklung

Serialisierung ist eine gängige Praxis. Dies ist eine bequeme Möglichkeit, Daten beim Programmieren mit Java zu speichern und abzurufen. Ohne Serialisierung wären Datenströme nicht in der Lage, die mit jedem Objekt verknüpften Parameter beim Speichern oder Teilen von Daten beizubehalten.

Dies ist der Ansatz, mit dem eine Nachricht über ein Netzwerk geteilt oder Informationen in einer Datenbank gespeichert werden. Der Hauptvorteil der Serialisierung besteht darin, dass Sie mit diesem Ansatz den Status eines Objekts speichern und zu einem späteren Zeitpunkt abrufen können.

Jedes zur Serialisierung markierte Objekt wird verarbeitet, über einen Datenstrom geteilt und von der Maschine oder dem Programm, das es empfängt, rekonstruiert.

Ohne Serialisierung würden Sie am Ende Werte erhalten, die keiner Ganzzahl oder Zeichenfolge zugeordnet sind. Trennzeichen würden verschwinden und es wäre unmöglich, ein Java-Objekt korrekt zu reproduzieren, nachdem es gespeichert oder über ein Netzwerk gesendet wurde.

Beachten Sie, dass Sie diese Methode nicht verwenden können, wenn Sie keinen Zugriff auf eine serialisierbare Schnittstelle haben. Sie müssen einem Klassenheader eine Markierung hinzufügen, um anzuzeigen, dass die Klasse einer serialisierbaren Schnittstelle zugeordnet ist. Alles, was Sie tun müssen, ist hinzuzufügen implementiert Serializable in der Klassenkopfzeile.

Sobald diese Markierung hinzugefügt wurde, weiß Ihr Code-Compiler, dass Objekte in dieser Klasse je nach verwendetem Stream zum Schreiben oder Lesen bereit sind. Eine Java Virtual Machine kann nur serialisierte Objekte lesen und schreiben.

Die Java Virtual Machine verwandelt jedes Objekt in das serialisierbare Klasse in Bytes. Der Bytestrom enthält die Objektwerte und die Art der mit dem Objekt verknüpften Informationen.

Die virtuelle Maschine erkennt Objekte, die die virtuelle Maschine in Ihrem Code serialisieren kann. Reflection ist der Standardmechanismus zur Identifizierung aller Elemente, die die virtuelle Maschine serialisieren muss. Wenn die Reflektion verwendet wird, enthält jeder Datenstrom eine Klassenbeschreibung, die mit der Klasse verknüpften Instanzdaten und die Beschreibung der mit der Klasse verknüpften serialisierbaren Superklassen.

Wenn Sie die Größe des Datenstroms reduzieren möchten, wechseln Sie zur Externalisierung. Bei dieser Methode enthält der Datenstrom viel weniger Informationen. Es enthält nur Details zur Klassenhierarchie, zur Superklassenstruktur und zur Identität der Klasse.

Klassenattribute sind ein weiterer Faktor, der dazu führen kann, dass die Serialisierung länger dauert. Jede serialisierbare Klasse sollte eine Versionsnummer haben. Dieser Parameter wird als a bezeichnet serialVersionUID. Wenn Sie es nicht manuell erstellen, berechnet die virtuelle Maschine es für jede Klasse, die serialisiert werden muss.

Einige Instanzvariablen können nicht serialisiert werden. Sie müssen diese Variablen als transient markieren, damit die Java Virtual Machine sie nicht serialisiert, während andere gültige Objekte in derselben Klasse verarbeitet werden. Sie können jede Variable als transient markieren, wenn Sie möchten, dass sie während des Serialisierungsprozesses ignoriert wird.

Beachten Sie, dass die Serialisierung mit Arrays und primitiven Variablen möglich ist. Allerdings können Sie die Serialisierung nicht verwenden, wenn Sie mit Referenztypen arbeiten.

Fangblock

Bei der Verwendung des E/A-Mechanismus können Fehler auftreten. Der Zweck der Fangblock besteht darin, diese Fehler zu erkennen und das zu tun, was am relevantesten ist. Sie müssen Ihren Catch-Block konfigurieren, um festzulegen, was er tun soll, wenn ein Fehler gefunden wird.

Wenn Sie bei der Verwendung des E/A-Mechanismus mit unterschiedlichen Fehlertypen rechnen, müssen Sie für jeden Fehlertyp einen Catch-Block erstellen.

Anschließend können Sie jedem Catch-Block mitteilen, was er tun soll, wenn ein Fehler erkannt wird, indem Sie einen letzten Block hinzufügen.

Sie müssen keine Catch- und Final-Blocks verwenden. Wenn Sie sich entscheiden, keine Blöcke zu verwenden, fügen Sie eine throws-Klausel in Ihren Dateiheader ein. Diese Markierung zeigt an, dass beim Aufruf einer Methode Fehler auftreten können. Sie können auch throws-Klauseln in jeden Methodenheader einfügen, wenn Sie andere Methoden einem bestimmten Catch-Block zuordnen möchten.

Die Verwendung des Datei-E/A-Mechanismus und der Serialisierung ist für das Speichern und Abrufen von mit Java-Dateien generierten Daten von entscheidender Bedeutung. Ohne diese Mechanismen wäre es unmöglich, Daten in einer Datenbank zu speichern oder Nachrichten über Netzwerke auszutauschen.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen