Wie bekomme ich ein plattformabhängiges neues Zeilenzeichen?

542

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

Spoike
quelle
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 .

Alex B.
quelle
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.

StriplingWarrior
quelle
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

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

Wenn Sie versuchen, eine neue Zeile in eine Datei zu schreiben, können Sie einfach die newLine () -Methode von BufferedWriter verwenden.

Michael Myers
quelle
31

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

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

ceving
quelle
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

Lexikon
quelle
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.

Sathesh Balakrishnan Manohar
quelle
13

Wenn Sie mit einer BufferedWriterInstanz in eine Datei schreiben , verwenden Sie die newLine()Methode dieser Instanz. Es bietet eine plattformunabhängige Möglichkeit, die neue Zeile in eine Datei zu schreiben.

Damaji Kalunge
quelle
1
Diese Antwort ist ein Duplikat von Mike Meyers .
Agi Hammerthief
-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( );
Gary Davies
quelle
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