Wie bekomme ich ein plattformabhängiges neues Zeilenzeichen?


542

Wie bekomme ich eine plattformabhängige Newline in Java? Ich kann nicht "\n"überall verwenden.


Bitte ändern Sie die akzeptierten Antworten. Die 2. Antwort ist angemessener.
Grau

Antworten:


364

Wenn Sie Java 1.5 oder höher und das String.format (oder andere Formatierungsmethoden ) verwenden, können Sie zusätzlich zur Eigenschaft line.separator%n wie in verwenden

Calendar c = ...;
String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY%n", c); 
//Note `%n` at end of line                                  ^^

String s2 = String.format("Use %%n as a platform independent newline.%n"); 
//         %% becomes %        ^^
//                                        and `%n` becomes newline   ^^

Weitere Informationen finden Sie in der Java 1.8-API für Formatierer .


7
Vielen Dank! Ich bin sicher, System.getProperty ("line.separator"); hat seine Verwendung, aber ich werde es leid zu sehen: "Zeile 1" + System.getProperty ("line.separator") + "Zeile 2"
Buttons840

43
Oh mein Gott, "Zeile 1" + System.getProperty ("line.separator") + "Zeile 2" ist in der Tat eines der hässlichsten Dinge, die ich je gesehen habe. Nur anderswo eine Konstante zu deklarieren, wäre weniger schmerzhaft.
Abahgat

4
Dies funktioniert zumindest nicht, wenn eine Zeichenfolge in eine log4j-Anweisung eingeht. Wenn Sie ein Beispiel mit einem Zeilenumbruch am Ende erstellen, wird das Problem möglicherweise ausgeblendet. Außerdem ist der String s2 nur verwirrend, wenn er '%% n'
Stealth Rabbi

6
Verwenden Sie dies nicht, wenn Ihre Zeichenfolge möglicherweise %Benutzereingaben enthält!
Konstantin Weitz

8
@KonstantinWeitz, das Problem von String.format(s + "%n")ist leicht zu lösen durch String.format("%s%n", s). Es ist immer riskant, Benutzereingaben als Formatkörper einzubeziehen (auf die gleiche Weise wie eval()).
Franklin Yu

710

Java 7 hat jetzt eine System.lineSeparator()Methode.


8
Es wäre sehr nett von ihnen gewesen, eine überladene Methode bereitzustellen, die eine lineSeperator(int)bestimmte Anzahl von Leitungsseparatoren zurückgibt, da ich häufig 2 gleichzeitig verwende.
Kon

10
@Kon Basierend auf dieser Antwort :String.join("", Collections.nCopies(5, System.lineSeparator()))
Samuel Harmer

4
Mit Java 11:System.lineSeparator().repeat(5)
Jacob G.

4
@ JacobG Hör auf dich zu freuen .. einige von uns stecken immer noch auf Java 7 fest.
Andrew T Finnell

@AndrewTFinnell Ich würde einen besseren Job finden <:-P Keine Container -> kein Java 11, also bleibst du für ein besseres Gehalt, wir können uns freuen :-D
Aubergine

650

Sie können verwenden

System.getProperty("line.separator");

um das Zeilentrennzeichen zu erhalten


4
Möchten Sie Java 7- System.lineSeparator()Details hinzufügen, damit Sie hier eine endgültige Antwort auf diese Frage erhalten?
Grau


31

Dies ist auch möglich : String.format("%n").

Oder String.format("%n").intern()um einige Bytes zu speichern.


7
Dies ist die gleiche Antwort wie Alex B.
Spoike

16
Oh, jetzt sehe ich es. Er schrieb so viel unaufgefordertes Zeug um seine Antwort. ;-)
Ceving

Ich habe dies versucht, aber als ich die Datei im Editor angezeigt habe, wird die neue Zeile nicht erkannt.
Mr5 5.

1
@ mr5 notepadist nicht das richtige Werkzeug, um den Inhalt einer Datei anzuzeigen. Verwenden Sie hexdumpoder od.
Ceving

@ceving Ich bin in einer Windows-Umgebung und ich hatte erwartet, dass die Newline die Kombination von\r\n
mr5

22

In der commons-lang- Bibliothek steht ein konstantes Feld mit dem Namen SystemUtils.LINE_SEPARATOR zur Verfügung


19
Ja, installieren Sie eine Bibliothek eines Drittanbieters, um eine plattformunabhängige neue Leitung zu erhalten! #facepalm
Shervin Asgari

23
@Shervin natürlich würden Sie das nicht tun, aber viele Projekte, an denen ich gearbeitet habe, verwenden bereits commons-lang und eine ältere Version von Java. Wenn Sie also bereits commons-lang verwenden, ist dies eine vernünftige Antwort. Ich hielt es nicht für notwendig, darauf hinzuweisen, ich habe mich offensichtlich geirrt.
Lexicalscope

2
Dies ist in der Tat ein guter Vorschlag für Projekte, die diese Bibliothek bereits verwenden, danke!
Alexis Leclerc

13
StringBuilder newLine=new StringBuilder();
newLine.append("abc");
newline.append(System.getProperty("line.separator"));
newline.append("def");
String output=newline.toString();

Das obige Snippet enthält zwei Zeichenfolgen, die unabhängig von den Plattformen durch eine neue Zeile getrennt sind.



-3

Vermeiden Sie das Anhängen von Zeichenfolgen mit String + String usw., und verwenden Sie stattdessen StringBuilder.

String separator = System.getProperty( "line.separator" );
StringBuilder lines = new StringBuilder( line1 );
lines.append( separator );
lines.append( line2 );
lines.append( separator );
String result = lines.toString( );

20
In den meisten Fällen spielt dies keine Rolle. Jeff Atwood von Coding Horror hat einen Blogbeitrag über diese spezielle Art der Mikrooptimierung verfasst . Führen Sie immer Metriken durch, bevor Sie Ansprüche wie "Nicht tun string + string" erheben .
Spoike

6
Ich würde sagen, dass Jeffs Artikel möglicherweise etwas abweicht, da er nur die Ausführungszeit berührt. Bei der Verkettung von Zeichenfolgen in Java geht es nicht nur um die Ausführungsgeschwindigkeit, sondern auch darum, wie viel Müll im Speicher verbleibt, damit der GC bereinigt werden kann. Dies kann dazu führen, dass der GC häufiger ausgeführt wird. Dies kann je nach Umgebung und Konfiguration ein Problem sein oder auch nicht.
Lajcik

7
Lajcik, ich vermute, dass dies eine Voroptimierung für alle Fälle ist, außer für diejenigen, die wirklich viel String-Manipulation durchführen. Der StringBuffer ist ein Anti-Pattern für geringfügige Verkettungsanforderungen. In vielen Fällen hätte ich lieber lesbaren String1 + Trennzeichen + String2 als das oben erwähnte mehrzeilige Beispiel. Außerdem würde ich vorschlagen, zu testen, ob Speicher und GC durch Hinzufügen des SB positiv beeinflusst werden. In vielen Fällen würde ich vermuten, dass dies nicht der Fall ist. Wenn es sich nicht lohnt zu testen, ist es wahrscheinlich voroptimiert und ich würde mich auf die Lesbarkeit konzentrieren.
Richard Watson

31
Das Ausführen eines String1 + String2 entspricht dem Ausführen eines neuen StringBuilder (String1) .append (String2) in modernen Compilern, sodass für einen einzeiligen String-Concat überhaupt keine Optimierung erfolgt. StringBuilder lohnt sich im Allgemeinen nur in Schleifen oder rekursiven Methoden. Dies könnte jedoch nicht in den Rahmen der ursprünglichen Frage fallen.
user327961

@ user327961: wahre Geschichte. Sie können dies leicht mit Ihrer Lieblings-IDE und einem Debugger beweisen.
Atmocreations
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.