Was ist los mit Javas "% n" in printf?

107

Ich lese Effective Java und es wird %nüberall für das Zeilenumbruchzeichen verwendet. Ich habe \nziemlich erfolgreich für Newline in Java-Programmen verwendet.

Welches ist das "richtige"? Was ist los mit \n? Warum hat Java diese C-Konvention geändert?

ripper234
quelle
1
Nur eine Vermutung, aber: Plattformübergreifende Unterstützung. Unterschiedliche Systeme verwenden unterschiedliche Zeichen für Zeilenumbrüche, z. B. \ n vs. \ r \ n. C # hat Environment.NewLine für den gleichen Zweck.
Jordan läuft
Java hat auch etwas im System, aber% n ist in einem printf einfacher.
Paul Tomblin
Warum hat Java diese C-Konvention geändert? == +1, :)
Michael Dimmitt
Keine Änderung, keine Ergänzung / Verbesserung. \ n bedeutet immer noch \ n
Bill K
(Hinweis für zukünftige Leser: C konvertiert bereits automatisch \nin plattformspezifische Zeilenumbrüche im Textformat, siehe dies , Java nicht)
user202729

Antworten:

150

Von einem schnellen Google:

Es gibt auch einen Bezeichner, der keinem Argument entspricht. Es ist "% n", das einen Zeilenumbruch ausgibt. In einigen Fällen kann auch ein "\ n" verwendet werden. Da "% n" jedoch immer das richtige plattformspezifische Zeilentrennzeichen ausgibt, ist es plattformübergreifend portierbar, "\ n" jedoch nicht.

Weitere Informationen finden Sie unter https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

Originalquelle

Bill K.
quelle
@ user2864740 Das stimmt, es wird nicht das richtige plattformspezifische Zeilentrennzeichen ausgegeben, sondern das aktuelle .
Hauke ​​Ingmar Schmidt
ähm, was bedeutet das?
Kalpesh Soni
Ich glaube, es verwendet das für das aktuelle Betriebssystem, auf dem es ausgeführt wird, aber wenn es unter Linux ausgeführt wird und Code für Windows ausgibt, ist es möglicherweise nicht das, wonach Sie suchen. Ich bin mir sonst nicht sicher, worauf sich die beiden anderen Kommentatoren bezogen haben könnten.
Bill K
24

Während dies \ndas richtige Zeilenumbruchzeichen für Unix-basierte Systeme ist, verwenden andere Systeme möglicherweise andere Zeichen, um das Ende einer Zeile darzustellen. Insbesondere die Verwendung von Windows-Systemen \r\nund frühen MacOS-Systemen \r.

Durch die Verwendung %nin Ihrer Formatzeichenfolge weisen Sie Java an, den von zurückgegebenen Wert zu verwenden System.getProperty("line.separator"), der das Zeilentrennzeichen für das aktuelle System darstellt.

Craig Putnam
quelle
18

Warnung:

Wenn Sie NETWORKING Code tun, könnten Sie die Gewissheit bevorzugen \n, im Gegensatz zu %ndenen verschiedene Zeichen über das Netzwerk senden kann, je nachdem , was Plattform es läuft auf.

George Forman
quelle
8

"richtig" hängt davon ab, was genau Sie versuchen zu tun.

\ n gibt Ihnen immer ein Zeilenende im "Unix-Stil". \ r \ n gibt Ihnen immer ein Zeilenende "dos style". % n gibt Ihnen das Zeilenende für die Plattform, auf der Sie laufen

C geht anders damit um. Sie können eine Datei entweder im "Text" - oder im "Binär" -Modus öffnen. Wenn Sie die Datei im Binärmodus öffnen, erhalten Sie mit \ n ein Zeilenende im "Unix-Stil" und mit "\ r \ n" ein Zeilenende im "Dos-Stil". Wenn Sie die Datei im "Text" -Modus auf einem dos / windows-System öffnen, konvertiert der Dateiverarbeitungscode beim Schreiben \ n in \ r \ n. Wenn Sie also eine Datei im Textmodus öffnen und \ n verwenden, erhalten Sie das plattformspezifische Zeilenende.

Ich kann sehen, warum die Designer von Java Cs hackige Ideen bezüglich der Dateimodi "Text" und "Binär" nicht replizieren wollten.

Peter Green
quelle
4

\nGenerieren Sie in Java immer \u000AZeilenvorschubzeichen. Um das richtige Zeilentrennzeichen für eine bestimmte Plattform zu erhalten, verwenden Sie es %n.

Verwenden \nSie diese \u000AOption, wenn Sie sicher sind, dass Sie Zeilenvorschubzeichen benötigen , z. B. im Netzwerk.
In allen anderen Situationen verwenden%n

Fathah Rehman P.
quelle
4

Beachten Sie, dass diese Antworten nur wahr sind, wenn Sie System.out.printf()oder System.out.format()oder das FormatterObjekt verwenden. Wenn Sie %nin verwenden System.out.println(), wird einfach eine %n, keine neue Zeile erzeugt.

user1677663
quelle
0

Der Formatbezeichner% n ist ein Zeilentrennzeichen, das betriebssystemübergreifend portierbar ist. Es kann jedoch nicht als Argument für die Funktionen System.out.print oder System.out.println verwendet werden.

Es wird immer empfohlen, diese neue Version des Zeilentrennzeichens über \ n zu verwenden.

Piyush Patel
quelle