Kategorien
Computer Programmierung

Ärgerlicher „Bug“ in Javas Files-API

Mannomannomann. Da debuggt man eine Stunde für einen Fehler, der m.E. im Design der Java-Files-API liegt.

Erwartungshaltung vs. implementierte Realität.

Wenn ich schreibe:

Files.writeString(file, content, StandardOpenOption.CREATE, StandardOpenOption.WRITE);

dann erwarte ich, dass eine neue Datei angelegt wird, falls sie noch nicht existiert, dass der Inhalt „content“ in die Datei geschrieben wird und diese danach nur diesen Inhalt enthält.

Aus mir unerfindlichen Gründen hat sich das Java-Team aber dafür entschieden, dass der Inhalt der Datei erhalten bleibt und mein Inhalt nur an den Anfang der Datei geschrieben wird und dort den vorhandenen Inhalt überschreibt. Wenn vorher also mehr drin ist, ist mein Inhalt drin und der Rest von dem, was vorher drin war.

WTF?

Korrekt ist:

Files.writeString(file, content, StandardOpenOption.CREATE, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING);

Man signalisiert, dass die Datei vor dem Schreiben geleert wird.

Ehrlich: wer denkt sich sowas aus. Die derzeitige default-Umsetzung sollte explizit angefordert werden (z.B. StandardOpenOption.KEEP_EXISTING) und default sollte das vorherige Leeren der Datei sein. Ich glaub, das würde die Mehrheit der Programmierer:innen auch so erwarten.

So ein Mistfehler, wie gesagt, eine Stunde debuggt und sucht mal danach.

Argh.