Che succede con "% n" di Java in printf?


107

Sto leggendo Java efficace e lo usa %novunque per il carattere di nuova riga. Ho usato \npiuttosto con successo per la nuova riga nei programmi Java.

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


1
Solo una supposizione, ma: supporto multipiattaforma. Sistemi diversi utilizzano caratteri diversi per le nuove righe, ad esempio \ n contro \ r \ n. C # ha Environment.NewLine per lo stesso scopo.
Jordan in esecuzione il

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

perché Java ha cambiato questa convenzione C == +1, :)
Michael Dimmitt

Non un cambiamento, un'aggiunta / miglioramento. \ n significa ancora \ n
Bill K

(nota per i lettori futuri: C si converte già automaticamente \nin una nuova riga specifica della piattaforma in formato testo, vedere questo , Java no)
user202729

Risposte:


150

Da un rapido google:

C'è anche uno specificatore che non corrisponde a un argomento. È "% n" che genera un'interruzione di riga. In alcuni casi può essere utilizzato anche un "\ n", ma poiché "% n" restituisce sempre il separatore di riga specifico della piattaforma corretto, è portabile tra piattaforme mentre "\ n" non lo è.

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

Fonte originale


@ user2864740 È vero, non restituisce il separatore di riga specifico della piattaforma corretto ma quello corrente .
Hauke ​​Ingmar Schmidt

umm, cosa significa?
Kalpesh Soni

Credo che utilizzi quello per il sistema operativo corrente su cui è in esecuzione, ma se è in esecuzione su Linux e invia codice per Windows potrebbe non essere quello che stai cercando. Altrimenti non sono sicuro a cosa si riferissero gli altri due commentatori.
Bill K


24

Sebbene \nsia il carattere di nuova riga corretto per i sistemi basati su Unix, altri sistemi possono utilizzare caratteri diversi per rappresentare la fine di una riga. In particolare, utilizzo del sistema Windows \r\ne primi sistemi MacOS utilizzati \r.

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


18

Avvertimento:

Se stai facendo codice NETWORKING, potresti preferire la certezza di \n, invece di %ninviare caratteri diversi attraverso la rete, a seconda della piattaforma su cui è in esecuzione.


8

"corretto" dipende da cosa stai cercando di fare esattamente.

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

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

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


4

In java, \ngenera sempre il \u000Acarattere di avanzamento riga. Per ottenere il separatore di riga corretto per un uso particolare della piattaforma %n.

Quindi usalo \nquando sei sicuro di aver bisogno del \u000Acarattere di avanzamento riga, ad esempio in rete.
In tutte le altre situazioni usa%n


4

Si noti che queste risposte sono vere solo quando si utilizza System.out.printf()o System.out.format()o l' Formatteroggetto. Se usi %nin System.out.println(), produrrà semplicemente una %n, non una nuova riga.


0

L'identificatore di formato% n è un separatore di riga portabile 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.

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.