\n funktioniert nicht bei Java

4 Antworten

Du kannst einen Plattformabhängigen Zeilentrenner wie folgt hinbekommen:

char n = System.getProperty("line.separator");

... oder so:

char n = String.format("%n");

Diese Variable definierst du einfach am Anfang deiner Methode "DateienEinlesen".

Danach kannst du in deiner Zeile mit dem Fehlverhalten einfach "\n" durch n ersetzen. :)

Das sieht dann so aus:

fw.write("[" + name + "]" + " " + d + "." + m + "." + y + " " + t + n);

Allerdings muss dir klar sein, dass so eine Verkettung von vielen Substrings mithilfe des "+" Operators verdammt ineffizient ist. Du solltest entweder mit StringBuildern arbeiten (die sind - anders als StringBuffer - nicht synchronisiert, und in deiner Funktion deutlich effizienter), oder du nutzt gleich die Format-Methode eines PrintStreams.

Dazu ersetzt du die Zeile:

FileWriter fw = new FileWriter("C:/Users/myName/Desktop/daten.txt", true);

... einfach durch einen FileOutputStream in einem PrintStream:

PrintStream ps = new PrintStream(new FileOutputStream("C:/Users/myName/Desktop/daten.txt", true)

, false, "UTF-8");

Die explizite angabe der Textkodierung erspart dir böse Überraschungen, wenn dein Programm plötzlich Dateien lesen soll, die auf einer anderen Plattform geschrieben wurde. (Normalerweise wird immer die Standardkodierung verwendet, und dabei kann man nicht immer von derselben ausgehen. Deshalb geben wir hier explizit UTF-8 an).

Damit würdest du auch gleich das Problem mit dem Plattformunabhängigen Newline-Zeichen erschlagen, die Zeile ist viel besser lesbar und dein Code ist effizienter im Bezug auf Speicherverbrauch und Geschwindigkeit:

ps.format("[%s] %02d.%02d.%02d %s%n", name, d, m, y, t);

Außerdem solltest du dir angewöhnen, auf Kommentare zu verzichten. Die Kommentare in deinem Beispiel erschweren die Lesbarkeit ungemein und bieten keinerlei zusätzliche (und vor allem nützliche) Informationen. Aber das ist auch nicht weiter schlimm, du bist ja noch ein Anfänger, und viele Anfänger aasen gerne mit Kommentaren. :)

Ich würde auch noch Leerzeilen zwischen Zeilen einfügen, die nicht direkt etwas miteinander zu tun haben, und "ps.close()" in einen finally-Block packen, um sicher zu stellen, dass die Datei auch wieder geschlossen wird, falls eine Ausnahme auftritt.

Alles in allem würde ich deine Funktion so umschreiben:

public static void main(String[] args) throws IOException {

Object namen[] = new Object[] {"Raphael", "Eva", "Anderer"};

Object name = JOptionPane.showInputDialog(null, "Wähle deinen Namen", "Name", JOptionPane.QUESTION_MESSAGE, null, namen, "Anderer");

Calendar cal = Calendar.getInstance();

Date dat = cal.getTime();

int y = cal.get(Calendar.YEAR);

int m = cal.get(Calendar.MONTH);

int d = cal.get(Calendar.DAY_OF_MONTH);

String da = dat.toString();

String t = da.substring(11, 19);

PrintStream ps = null;

try {

ps = new PrintStream(new FileOutputStream("C:/Users/myName/Desktop/daten.txt", true), false, "UTF-8");

ps.format("[%s] %02d.%02d.%02d %s%n", name, d, m, y, t);

} finally {

if (ps != null) {

ps.close();

}

}

}

Ehrlich gesagt würde ich noch sehr vieles anders machen, aber ich wil dich jetzt auch nicht überfordern.

Und ganz ehrlich gesagt ist dieser neue Editor hier auf GF für ernsthafte Antworten absolut unbenutzbar, da total verbuggt. Ein absoluter Krampf! Wenn du jemals professioneller Programmierer werden willst, versuch bitte, nicht so zu pfuschen, wie das GF-Team ... ganz ehrlich, wie kann man ein so verkorkstes Webinterface auf die Öffentlichkeit loslassen ... da fehlen mir die Worte! ><

Ansonsten viel Erfolg noch mit Java und viel Spaß beim Programmieren! :)

TeeTier  15.05.2015, 00:34

PS: Dieser vermurkste Code-Editor hat tatsächlich meine Quelltextformatierung komplett zerstört, vor allem die Unterteilung von Blöcken zusammengehöriger Zeilen durch Leerzeilen wurde entfernt und nach jeder Zeile eine Leerzeile eingefügt. Watt soll datt denn???

Tja, so etwas passiert halt, wenn man "auch mal mit Web 3.0" spielen möchte, aber leider keine Ahnung von ordentlichem Programmieren hat. Das PHP-Frontend und das Scala-Backend machen auch keinen besseren Eindruck.

Ich hatte hier mal vollen Zugriff auf den serverseitigen Quelltext (natürlich durch einen Bug) und bin bei der "Codequalität" fast umgefallen ... aber das ist ein anderes Thema.

Was für ein grottiger Pfusch hier ... un-fass-bar. ><

1
rmnstr  15.05.2015, 01:23

DH für die Erwähnung, dass Stringoperationen in der Praxis sehr hohe Performance-Einbußungen mit sich bringen.

Und natürlich auch für die Kritik am Codeeditor ;)

1
PerfectMuffin  15.05.2015, 06:45

Das kann so nicht richtig sein. Char ist ein Zeichen, der Windows-lineSeparator sind aber zwei Zeichen, du kannst den korrekten Windows-lineSeparator also nie mit char speichern.

0
TeeTier  16.05.2015, 09:44
@PerfectMuffin

Sorry, natürlich muss die Variable "n" ein String sein und kein Char! Danke für die Korrektur! :)

0

Zeilenumbruch sollte man mit \r\n machen. Vielleicht klappt das.

Dein langes Programm zum Schreiben der Datei lässt sich auf wenige Zeilen eindampfen, die noch dazu zuverlässiger und lesbarer sind. Etwa so:

DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss");
String result = String.format("[%s] %s%n", name, dateFormatter.format(LocalDateTime.now()));
Files.writeString(Path.of("daten.txt"), result);
  • Die alten Klassen java.util.Calendar & Co. sollte man längst nicht mehr verwenden - sie sind umständlich und fehleranfällig. Alles mit Datum und Zeit sollte man aus java.time.* holen.
  • Dein Programm krankt dazu an ein paar Dingen, die du nicht explizit angibst: du verlässt dich etwa auf das lokale Datumsformat, wenn du die Zeit rausholst - das kann leicht schiefgehen. Ebenso hängt es sozusagen vom Zufall ab, mit welcher Kodierung du die Datei schreibst und ob der Zeilenumbruch funktioniert oder nicht (Windows erwartet CR+NL, der Rest der Welt nur NL).
  • Viele Dateioperationen sind mit der Klasse java.nio.file.Files sehr einfach zu erledigen. In diesem Fall ist es sogar nur ein Einzeiler, aber auch komplexere Themen sind damit erleichtert. Schau sie dir an.