Come posso ottenere un nuovo carattere di linea dipendente dalla piattaforma?


542

Come posso ottenere una newline dipendente dalla piattaforma in Java? Non posso usare "\n"dappertutto.


Ti preghiamo di considerare di cambiare le risposte accettate. La seconda risposta è più appropriata.
Gray,

Risposte:


364

Oltre alla proprietà line.separator, se si utilizza java 1.5 o versione successiva e String.format (o altri metodi di formattazione ) è possibile utilizzare %ncome in

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   ^^

Vedi l' API Java 1.8 per Formatter per maggiori dettagli.


7
Grazie! Sono sicuro System.getProperty ("line.separator"); ha i suoi usi, ma mi stanco di vedere: "Linea 1" + System.getProperty ("line.separator") + "Line 2"
Buttons840

43
Oh mio Dio, "Linea 1" + System.getProperty ("line.separator") + "Linea 2" è davvero una delle cose più brutte che io abbia mai visto. Dichiarare una costante altrove sarebbe meno doloroso.
Abahgat,

4
questo non funziona, almeno, con una stringa che entra in un'istruzione log4j. La creazione di un esempio con una nuova riga alla fine nasconde potenzialmente il problema. Inoltre, String s2 confonde semplicemente usando '%% n'
Stealth Rabbi

6
Non usarlo se la tua stringa potrebbe contenere %input dell'utente!
Konstantin Weitz,

8
@KonstantinWeitz, il problema String.format(s + "%n")è facilmente risolvibile String.format("%s%n", s). È sempre rischioso coinvolgere l'input dell'utente come corpo del formato (allo stesso modo di eval()).
Franklin Yu,

710

Java 7 ora ha un System.lineSeparator()metodo.


8
Sarebbe stato molto carino da parte loro fornire un metodo sovraccarico lineSeperator(int)che restituisse un certo numero di separatori di linea, come spesso mi ritrovo a usare 2 contemporaneamente.
Kon

10
@Kon Sulla base di questa risposta :String.join("", Collections.nCopies(5, System.lineSeparator()))
Samuel Harmer

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

4
@JacobG Smetti di gongolare .. alcuni di noi sono ancora bloccati su Java 7.
Andrew T Finnell

@AndrewTFinnell Troverei un lavoro migliore <:-P Nessun contenitore -> nessun Java 11, quindi stai per un salario migliore, possiamo gongolare MrGreen
Melanzana

650

Puoi usare

System.getProperty("line.separator");

per ottenere il separatore di linea


4
Vuoi aggiungere i System.lineSeparator()dettagli di Java 7, quindi ecco una risposta definitiva a questa domanda?
Gray,


31

Anche questo è possibile: String.format("%n").

O String.format("%n").intern()per salvare alcuni byte.


7
Questa è la stessa della risposta di Alex B.
Spoike,

16
Oh ora lo vedo. Ha scritto così tante cose non richieste intorno alla sua risposta. ;-)
ceving

Ho provato a farlo, ma quando ho visualizzato il file nel blocco note, non riconosce la nuova riga.
5

1
@ mr5 notepadnon è lo strumento giusto per visualizzare il contenuto di un file. Usa hexdumpo od.
ceving

@ceving Sono su un ambiente Windows e mi aspettavo che la nuova riga fosse la combinazione di\r\n
mr5

22

La libreria commons-lang ha un campo costante disponibile chiamato SystemUtils.LINE_SEPARATOR


19
Sì, installa una libreria di terze parti solo per ottenere una nuova linea indipendente dalla piattaforma! #facepalm
Shervin Asgari

23
@Shervin ovviamente non lo faresti, ma molti progetti a cui ho lavorato stanno già utilizzando commons-lang e alcune versioni precedenti di Java. Quindi, se ti capita di usare già commons-lang, questa è una risposta ragionevole. Non ho ritenuto necessario precisarlo, ovviamente avevo torto.
lessicalscope

2
Questo è davvero un buon suggerimento per i progetti che stanno già utilizzando questa libreria, grazie!
Alexis Leclerc,

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

Lo snippet sopra avrà due stringhe separate da una nuova linea indipendentemente dalle piattaforme.



-3

Evita di aggiungere stringhe usando String + String ecc., Usa invece 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
Questo in realtà non importa nella maggior parte dei casi, Jeff Atwood di Coding Horror ha pubblicato un post sul blog su questo particolare tipo di micro-ottimizzazione . Esegui sempre le metriche prima di fare affermazioni come "non fare string + string".
Spoike,

6
Direi che l'articolo di Jeff potrebbe essere un po 'fuori dal momento che tocca solo i tempi di esecuzione. La concatenazione di stringhe in Java non riguarda solo la velocità di esecuzione, ma anche la quantità di immondizia che si lascia in memoria per la pulizia del GC, il che può comportare l'esecuzione più frequente del GC. Questo potrebbe o non potrebbe essere un problema a seconda dell'ambiente e della configurazione.
Lajcik,

7
Lajcik, sospetto che sia pre-ottimizzazione per tutti i casi tranne quelli che fanno davvero molta manipolazione delle stringhe. StringBuffer è un anti-pattern per requisiti di concatenazione minori. In molti casi preferirei leggere String1 + separator + String2 piuttosto che l'esempio multilinea sopra menzionato. Inoltre, suggerirei di verificare se la memoria e GC sono influenzati positivamente aggiungendo SB. In molti casi immagino che non lo sia. Se non vale la pena testarlo, probabilmente è pre-ottimizzato e mi concentrerei sulla leggibilità.
Richard Watson,

31
Fare String1 + String2 è lo stesso che fare il nuovo StringBuilder (String1) .append (String2) nei compilatori moderni, quindi non c'è alcuna ottimizzazione per un concat per una stringa di linea. StringBuilder è generalmente valsa la pena solo in loop o metodi ricorsivi. Ma comunque, questo potrebbe essere al di fuori dell'ambito della domanda originale.
user327961,

@ user327961: storia vera. Si può facilmente provare questo usando il tuo IDE preferito e un debugger.
Atmocreations
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.