2009-12-10 3 views
72

Sto leggendo Java efficace e utilizza %n per il carattere di nuova riga ovunque. Ho usato \n piuttosto con successo per newline nei programmi Java.Cosa succede con Java "% n" in printf?

Qual è il "corretto"? Cosa c'è che non va con \n? Perché Java ha cambiato questa convenzione C?

+1

Solo un'ipotesi, ma: supporto multipiattaforma. Sistemi diversi utilizzano caratteri diversi per le nuove linee, ad es. \ n vs \ r \ n. C# ha Environment.NewLine per lo stesso scopo. –

+0

Anche Java ha qualcosa in System, ma% n è più semplice in un printf. –

+0

perché java ha cambiato questa convenzione c == +1, :) –

risposta

107

Da una rapida di Google:

C'è anche un identificatore che non corrisponde ad un argomento. È "% n" che emette un'interruzione di riga. In alcuni casi è anche possibile utilizzare "\ n", ma poiché "% n" restituisce sempre il separatore di riga specifico della piattaforma, esso è trasferibile su tutte le piattaforme, mentre "\ n" non lo è.

Fare riferimento https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

Original source

+3

Dove "il separatore di riga corretto" è in gran parte arbitrario in base al contesto utilizzato. – user2864740

+0

@ user2864740 È vero, non emette il separatore di riga specifico della piattaforma _correct_ ma quello _corrente_. –

19

Mentre \n è il carattere di nuova riga corretta per sistemi basati su Unix, altri sistemi può usare caratteri diversi per rappresentare la fine di una linea. In particolare, il sistema Windows utilizza \r\n ei primi sistemi MacOS utilizzati \r.

Utilizzando %n nella stringa del formato, comunicare a Java di utilizzare il valore restituito da System.getProperty("line.separator"), che è il separatore di riga per il sistema corrente.

13

Attenzione: se stai facendo il codice NETWORKING, potresti preferire la certezza di \ n, al contrario di% n che potrebbe inviare caratteri diversi attraverso la rete, a seconda di quale piattaforma è in esecuzione.

7

"corretto" dipende da cosa esattamente si sta tentando di fare.

\ n ti darà sempre una fine linea "stile unix". \ r \ n ti darà sempre un finale in stile "dos style". % n ti darà la fine della linea per la piattaforma su cui stai correndo

C gestisce questo in modo diverso. Puoi scegliere di aprire un file in modalità "testo" o "binario". Se apri il file in modalità binaria, \ n ti darà un finale di linea "stile unix" e "\ r \ n" ti darà una fine riga "stile dos". Se apri il file in modalità "testo" su un sistema dos/windows, quando scrivi \ n il codice di gestione file lo converte in \ r \ n. Quindi aprendo un file in modalità testo e usando \ n si ottiene la fine della linea specifica della piattaforma.

Posso capire perché i progettisti di java non volevano replicare le idee hacky di C relative alle modalità file "testo" e "binario".

4

In java, \n genera sempre il carattere di avanzamento riga \u000A. Per ottenere il corretto separatore di linea per una particolare piattaforma, utilizzare %n.

Quindi utilizzare \n quando si è certi che è necessario il carattere di alimentazione di riga \u000A, ad esempio in rete.
In tutte le altre situazioni usano %n

1

Avviso queste risposte sono vere solo se si utilizza System.out.printf() o System.out.format() o l'oggetto Formatter. Se si utilizza %n in System.out.println(), verrà semplicemente prodotto uno %n, non un nuovo fine riga.

0

% n l'identificatore di formato è un separatore di riga che è portatile tra i sistemi operativi. Tuttavia, non può essere utilizzato come argomento per le funzioni System.out.print o System.out.println.

Si consiglia sempre di utilizzare questa nuova versione del separatore di riga sopra \ n.