EMZETT.
Login

FileOutputStream

Kurz: Ein Byte-Stream zum rohen, ungepufferten Schreiben in eine Datei — das Gegenstück zum FileInputStream für die Schreibrichtung.

Genauer: Wie beim Lesen ist auch beim Schreiben ein roher, ungepufferter Byte-Stream bei vielen kleinen Schreibvorgängen ineffizient — üblich ist deshalb, ihn mit einem gepufferten Wrapper zu kombinieren, der Daten sammelt und in größeren Blöcken schreibt. Wichtig ist, den Stream nach dem Schreiben zu schließen, damit gepufferte Daten tatsächlich auf den Datenträger gelangen.

Im Detail

try (FileOutputStream fos = new FileOutputStream("ausgabe.bin")) {
    fos.write(byteArray);
}

Genau wie der FileInputStream arbeitet dieser Stream auf der niedrigsten Ebene mit einzelnen Bytes, ohne jede Interpretation des Inhalts — er eignet sich deshalb für beliebige Binärdaten (Bilder, komprimierte Dateien, serialisierte Objekte), nicht nur für Text.

Ein wichtiger zusätzlicher Aspekt beim Schreiben, der beim Lesen keine Rolle spielt: der Modus. Ein FileOutputStream kann standardmäßig eine bestehende Datei komplett überschreiben, oder — über einen zusätzlichen Konstruktor-Parameter (append = true) — an den bestehenden Inhalt anhängen, statt ihn zu ersetzen. Wird dieser Parameter vergessen, wenn eigentlich angehängt werden sollte (z. B. bei einer wachsenden Logdatei), gehen alle bisherigen Inhalte beim nächsten Programmstart verloren.

Genau wie beim Lesen gilt: Für reinen Text ist ein roher Byte-Stream selten die richtige Wahl, weil die Umwandlung von Zeichen in Bytes (die Kodierung) explizit berücksichtigt werden muss — ein zeichenbasierter Writer übernimmt das automatisch korrekt. Ein FileOutputStream wird typischerweise dann direkt verwendet, wenn bereits fertige Bytes vorliegen (z. B. der Inhalt einer heruntergeladenen Datei), die 1:1 unverändert auf den Datenträger geschrieben werden sollen.

Wie bei jeder Ressource, die Systemhandles belegt und gepufferte Daten enthalten kann, ist zuverlässiges Schließen entscheidend — bei einem Absturz zwischen write() und dem Schließen des Streams können ungepufferte, noch nicht physisch geschriebene Daten verloren gehen. try-with-resources garantiert das Schließen automatisch, auch bei einer Exception mitten im Schreibvorgang.

Siehe auch: I/O Streams, BufferedWriter, FileInputStream