\n wird als \\n aus File eingelesen - replaceAll funktioniert nicht

TimeIsTheKey

Aktives Mitglied
Hallo,

ich habe eine kurze Frage. Mein Programm liest aus einem File zeilenweise ein und wandelt dabei jedes \n in ein \\n um. Ist das normal oder mache ich irgendwo einen Fehler?

Code:
String row;
BufferedReader input;

...

this.row = input.readLine();

Falls mein Input so aussieht: "Hallo, \n \n \n \n dies ist ein Beispiel." wird daraus folgendes gemacht: "Hallo, \\n \\n \\n \\n dies ist ein Beispiel."

In der API steht "Returns:
A String containing the contents of the line, not including any line-termination characters, or null if the end of the stream has been reached ". Würde das nicht bedeuten das gar keine \n im String sein sollten und dann "Hallo, dies ist ein Beispiel." drinsteht?

Edit: Ich kriege keinen Workaround hin ... Ich mache 'row.replaceAll("\\n","\n")' aber die \\n bleiben. Ich habs auch mal mit 'row.replaceAll("\\\\n","\\n")' versucht, weil ich gehört habe das pro Backslash selbst einen braucht, aber das war auch nicht die Lösung. Ist für mich wirklich unverständlich wieso es nicht das macht was man sagt. Ist die letzte Funktion meines Programms, dann wäre ich mit meinem ersten grossen Programm endlich durch.

MfG
 
Zuletzt bearbeitet:
Hallo,

Du musst hier etwas differenzieren. Wenn Du ein "\n" in eine Textdatei schreibst, dann ist das keineswegs ein Zeilenumbruch sondern zwei Zeichen, eben "\" und "n". Eine Textdatei initerpretier solche Werte nicht (warum auch?). Willst Du dort einen Zeilenumbruch einfügen, dann verwendest Du einfach die Enter-Taste. Hierbei wird unter Windows ein CR LF (Carriage Return. Line Feed) eingefügt, unter den Unixen nur ein CR und ich glaube unter MAC OS ein LF.

Auf jeden Fall sind das alles Steuerzeichen, die Du in jeder ASCII Tabelle findest, die werden aber eben nicht angezeigt. Das es für Java Programme recht unpraktisch wäre bei jedem String, den Du erzeugst für jeden Zeilenumbruch, Tabulator oder ähnliches den String zu beenden und ein spezielles Steuerzeichen einzufügen (oder auch direkt den Byte Wert des Steuerzeichens), interpretiert Java seine Strings. Dort wird ein \n automatisch durch den, vom System verwendeten, Zeilenumbruch ersetzt, ein \t durch einen Tabulator usw.
Das heißt, dass Steuerzeichen in Javastrings durch ein \ eingeleitet werden. Das Problem ist jetzt, woher weiß Java nun ob Du den String "\n" anzeigen oder einen Zeilenumbruch einfügen möchtest? Ganz einfach, Java interpretiert immer das Zeichen hinter dem \ mit. Folgt ein n, ist ein Zeilenumbruch gemeint, folgt ein \ (also "\\"), dann wird ein \ ausgegeben.

Für Deine Textdatei gilt nun das gleiche. Wenn Du die Einliest, dann wäre der String "\n" binär nichts anderes als 0x5C 0x6E und das sind zwei anzeigbare Chars. Ein "\" wird dann eben entsprechend escaped und damit zu "\\". Ein Zeilenumbruch in der Textzeile hingegen würde binär als 0x0D 0X0A (oder auch nur ein einzelnes Element, je nach OS) codiert werden.
 
Vielen Dank für die Hilfe. Mein Programm funktioniert nun, aber leider geht die replaceAll Methode immernoch nicht. Ich habe einen Workaround gemacht damit es funktioniert. Ich verstehe nicht wo der Unterschied liegt.

Hier mal die replaceAll-Methode:
Code:
this.row.replaceAll("\\\\n", "\n");

Weil diese einfach nicht klappt habe ich nun folgendes machen müssen:
Code:
String[] workaround = row.split("\\\\n");
				this.row = workaround[0];
				for(int i = 1; i < workaround.length; i++){
					this.row += "\n";
					this.row += workaround[i];
				}

Hat jemand eine Erklärung wieso das replaceAll nicht funktioniert?
 
Naja, syntaktisch gehts. Habs auch mit "\\n" versucht, aber ich möchte es ja nicht escapen, also würde es keinen Sinn ergeben. Es kommt das gleiche Ergebnis dabei raus.
 
"Hallo, \\n \\n \\n \\n dies ist ein Beispiel."

wenn du hier \\\\n mit \n replacen willst, passiert einfach garnichts. wie kommst du überhaupt auf \\\\n, wenn du doch selbst sagst, dein String besteht aus "\\n" kombinationen?

versuchts mit replace \\n mit \n, sollte eig. klappen.
 

Zurück
Oben