Java Zeilenumbruch?
Hallo,
in Java wird ja durch \r zurück auf den Beginn der Zeile gesetzt und durch \n eine neue Zeile eingeleitet. Wenn ich das jetzt so einbaue: bw.write("hallo\r\nhello");, dann kommt das ja raus:
"hallo" und direkt darunter "hallo"
Schreibe ich es aber so: bw.write("hallo\n\rhello");, dann kommt das raus:
"hello"
"hello".
Weshalb ist dann noch eine Lücke dazwischen? Zunächst wird ja "hallo" geschrieben. Danach folgt ja die Entstehung einer Lücke darunter und die Zeile wird auf Beginn gesetzt. Dann müsste es doch wie oben aussehen?!
4 Antworten
Es gibt 2 zeichen um eine neue zeile zu markiren. LF und CR.
Windows benutzt bei jeder zeilen endung CRLF, und linux/macOS X benutzt nur LF. Früher hat macOS CR benutzt.
In windows müsstest du also machen \r\n.
Kann gut sein dass deine IDE denkt dass das einmal ein unix zeilenumbruch sein soll, und einmal ein macOS zeilenumbruch.
Im Zweifelsfall ersetzt du einfach deinen Zeilenumbruch durch System.lineSeparator(), das wählt automatisch den richtigen zeilenumbruch für deine umgebung.
Das ist einfach eine Konvention. Zeilen die an der selben stelle beginnen gibt es bei ner Schreibmaschine, aber nicht in computern, dementsprechend spart man sich das Zeichen.
Egal ob CRLF, CR oder LF, alle markieren eine neue Zeile am Anfang.
Von der bedeutung her würde man so denken, CR bringt dich an den anfang, LF in ne neue zeile, aber in der praxis landet man immer in ner neuen zeile und am anfang.
Ich habe aber folgendes gelesen: https://www.java-forum.org/thema/bedeutung-von-r.17480/ Schau dir den vorletzten Kommentar an.
Ja du solltest aber richtig lesen...
der Unterschied damals war
[...]
von der Schreibmaschinenzeit und ist noch heute da
Heute gibt es keinen unterschied mehr, früher, als man sich ascii ausgedacht hat, wollte man einen haben.
Das einzige was bleibt sind die beiden Zeichen.
Ok, danke. Und was hat es mit "LF" und "CR" auf sich? Vermutlich mit ASCII, aber ich kenne mich da nicht so aus...
Wie bereits gesagt
Es gibt 2 zeichen um eine neue zeile zu markieren. LF und CR.
Windows benutzt bei jeder zeilen endung CRLF, und linux/macOS X benutzt nur LF. Früher hat macOS CR benutzt.
Es sind lediglich zwei zeichen im ascii zeichensatz. https://www.overcoded.net/wp-content/uploads/340/ascii-table-overcoded-scaled.jpg
Das macht manchmal probleme, dementsprechend hat git z.B. funktionen um beim pushen zeilenendungen zu konvertieren usw..
Ok, also drücken die beiden ob alleine oder zusammen einfach nur in Java den Umbruch aus?!
Korrekt.
Es sind im endeffekt nur zeichen, was die umgebung damit macht ist der umgebung überlassen. Aber den IDE's ist das egal ob du nun CR, LF oder CRLF schreibst.
Die meißten non printable ascii zeichen die du da am anfang siehst werden kaum noch benutzt https://web.itu.edu.tr/sgunduz/courses/mikroisl/ascii.html
Damals wusste man ja noch nicht wie computer in 60 jahren funktionieren. in dem zeichensatz ist auch so spaß wie vertikale tabs undso drinnen, die benutzt kein programm heute.
Mich irritiert halt gerade nur dieses: bei \r\n steht alles direkt unten drunter, warum gibt es aber eine Lücke dazwischen bei umgekehrter Schreibweise?!
Habe ich auch schon beantwortet.
Kann gut sein dass deine IDE denkt dass das einmal ein unix zeilenumbruch sein soll, und einmal ein macOS zeilenumbruch.
Musst die Antwort schon lesen.
\r\n erzeugt LFCR. Das ist also kein windows zeilenumbruch, sondern ein unix Zeilenumbruch(LF) und ein macOS Zeilenumbruch(CR).
Ich gebe dir mal einen tipp, in java schreiben 99.9% der leute für einen zeilenumbruch einfach /n und gut ist.
Ja, danke. Mich hat, wo du gerade auf deine vorherige Antwort verweist, nur irritiert, dass die IDE ja eigentl. merken müsste, auf welchem Betriebssystem ich operiere. Sprich, dass sie nur von Windows ausgeht und nicht von Unix oder macOS. Also erzeugt der Unix Zeilenumbruch \r\n eine Lücke dazwischen und die Schreibweise \n\r nicht? Das würde dann Sinn ergeben! LG
Bevor du da mit \n\r oder so hantierst, mach einfach System.lineSeparator(), das wählt die richtige Zeilenendung für deine umgebung.
\r\n sollte keine Lücke erzeugen(unter windows), \n\r wahrscheinlich.
Nochmal
Windows benutzt bei jeder zeilen endung CRLF, und linux/macOS X benutzt nur LF. Früher hat macOS CR benutzt.
Genau, also du bist auch der Meinung, das bei Unix noch eine Lücke erzeugt wird? Und bei macOS nicht? Das lässt mir keine Ruhe! Ich werde aber deinen Tipp beherzigen!
Nein, bin ich nicht.
Windows benutzt bei jeder zeilen endung CRLF, und linux/macOS X benutzt nur LF. Früher hat macOS CR benutzt.
/r erzeugt CR, /n erzeugt LF
Was verstehst du dadran nicht?
Viele IDE's unterstützen mehrere Zeilenendungen. Dementsprechend funktioniert ein einzelnes /n eigentlich immer als zeilenendung.
Würde halt nur gerne wissen, wie man den Unterschied, eine Zeile mehr erklären kann...
Weil \n\r die zeichenfolge LFCR erzeugt. \n\r erzeugt die zeichenfolge CRLF.
LFCR sind zwei zeilenendungen(eben eine aus unix und eine aus macOS), CRLF nur eine.
Zum dritten mal schon jetzt.
Also ist einfach ja nur einprogrammiert, dass CRLF eine erzeugt und LFCR 2, oder?!
Das kommt auf das Programm an...
Das hat mit java nichts zu tun, wie uint richtig erkannt hat.
- Die Ausgabe ist abhängig vom Programm
- Je nach Programm, welches die Ausgabe anzeigt, kann es sein, dass dieses Programm den System-Spezifischen Line-Separator verwendet oder irgendwas eigenes macht.
- In deinem Fall der Ausgabe in eine Windows-Console wird \r\n, \r und \n innerhalb der Console als Zeilenumbruch gewertet. \r\n wird gefunden und es erfolgt genau EIN Zeilenumbruch.
- In deinem Fall der Ausgabe in eine Datei hast du folgende Kombination angegeben: \n\r. Damit wird \r\n nicht gefunden, \n wird gefunden und \r auch. Damit sind das 2 Zeilenumbrüche.
Ich habe das Programm Notepad++ mal benutzt:

Das hat mit Java an sich grundsätzlich nichts zu tun, sondern nur mit der Umgebung, in der das Programm läuft.
Verschiedene Betriebssysteme, Terminalemulatoren, usw. werden unterschiedliche Ergebnisse liefern.
Mit Java hat das nichts zu tun.
Ja und wie kann man das erklären? Warum bleibt beim 2.Beispiel der Text nicht in der 2. Zeile, sondern geht in die 3.?
Weil dein Terminal es so handhabt. Das hat nichts mit Java zu tun!
Guck dir die Einstellungen oder die Dokumentation deines Terminalemulators an. Ich kann nicht wissen, welche der hunderten verfügbaren du nutzt und wie die sich alle verhalten.
Ich schreibe nichts im Terminal, sondern in eine txt Datei....
Dann hängt es davon ab, wie der Texteditor damit umgeht. Dabei gibt es ebenfalls X Möglichkeiten.
Offensichtlich bewirkt \r am Anfang der Zeile einen Zeilenumbruch.
Ja und? Dann müsste es aber immer noch in der selben Zeile unten drunter sein...
Ok, aber was mich nur irritiert, ist folgendes: Schreibe ich doch nur \n, müsste doch der Text direkt unten drunter stehen, da man ja nicht auf den Beginn der Zeile gesetzt hatte. Stattdessen steht der Text aber zu Beginn der Zeile direkt darunter.