Wie können primitive Datentypen in Binär-Dateien abgelegt und aus diesen gelesen werden?

Die beiden Klassen DataInputStream und DataOutputStream ermöglichen es, primitive Datentypen in portabler Weise zu lesen und zu schreiben. Sie implementieren die Schnittstellen DataInput bzw. DataOutput, die entsprechende Lese- und Schreibemethoden bereit stellen.

Der Quelltext zeigt die Java-typische Schachtelung mehrerer Streams, die es ermöglicht, je nach Aufgabenstellung unterschiedlichste Lese- und Schreibeoperationen durchzuführen.
Im vorliegenden Fall öffnet ein FileInputStream in der Methode liesDatenAusDatei() eine Binärdatei und stellt einen entsprechenden Byte-Stream zur Verfügung. Er wird an den Konstruktor eines BufferedInputStream übergeben. Dieser speichert die vom DataInputStream gelesenen Daten temporär zwischen und erhöht so die Performance des Lesevorgangs. Der Lesevorgang selbst findet im vorliegenden Fall mit Hilfe der spezialisierten Methoden readInt() und readDouble() statt. Nach Abschluss des Lesevorgangs und entsprechender Weiterverarbeitung (hier: Ausgabe auf die Konsole) muss die ausgelesene Datei durch die von der Oberklasse FilterInputStream geerbte Methode close() wieder geschlossen werden.
Der beschriebene Prozess findet innerhalb eines try-catch-Blockes statt, der die Existenz bzw. Lesbarkeit der Datei und den Lesevorgang selbst überwacht.

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class FileStreamDemo {

    private final String datei = "zahlen.dat";

    public static void liesDatenAusDatei() {
        DataInputStream dis = null;
        try {
            dis = new DataInputStream(
                    new BufferedInputStream(
                    new FileInputStream(datei)));

            System.out.println(dis.readInt());
            System.out.println(dis.readDouble());

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (dis != null) dis.close();
            } catch (IOException ioe){}
        }
    }

    public static void schreibeDatenInDatei() {
        DataOutputStream dos = null;
        try {
            dos = new DataOutputStream(
                    new BufferedOutputStream(
                    new FileOutputStream(datei)));

            dos.writeInt(-5);
            dos.writeDouble(Math.PI);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (dos != null) dos.close();
            } catch (IOException ioe){}
        }
    }

    public static void main(String[] args) {
        schreibeDatenInDatei();
        liesDatenAusDatei();
    }
}

Der Schreibvorgang in die Datei findet in der Methode schreibeDatenInDatei() auf symmetrische Weise statt: Die gleiche Schachtelung wird hier durch die entsprechenden OutputStreams gewährleistet und den Schreibvorgang selbst erledigen die zugehörigen write()-Methoden.

Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.