¿Qué pasa con "% n" de Java en printf?

107

Estoy leyendo Effective Java y se usa %npara el carácter de nueva línea en todas partes. He utilizado con \nbastante éxito la nueva línea en programas Java.

¿Cual es la correcta? ¿Qué pasa con \n? ¿Por qué Java cambió esta convención de C?

destripador234
fuente
1
Solo una suposición, pero: soporte multiplataforma. Los diferentes sistemas utilizan diferentes caracteres para las nuevas líneas, por ejemplo, \ n frente a \ r \ n. C # tiene Environment.NewLine para el mismo propósito.
Jordan Running
Java también tiene algo en System, pero% n es más fácil en printf.
Paul Tomblin
¿Por qué Java cambió esta convención c == +1, :)
Michael Dimmitt
No es un cambio, una adición / mejora. \ n todavía significa \ n
Bill K
(nota para los futuros lectores: C ya se convierte automáticamente \na una nueva línea específica de la plataforma en formato de texto, vea esto , Java no lo hace)
user202729

Respuestas:

150

De un google rápido:

También hay un especificador que no corresponde a un argumento. Es "% n" el que genera un salto de línea. También se puede usar "\ n" en algunos casos, pero como "% n" siempre genera el separador de línea específico de la plataforma correcto, es portátil entre plataformas, mientras que "\ n" no lo es.

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

Fuente original

Bill K
fuente
@ user2864740 Eso es cierto, no genera el separador de línea correcto específico de la plataforma, sino el actual .
Hauke ​​Ingmar Schmidt
umm, ¿qué significa eso?
Kalpesh Soni
Creo que usa el del sistema operativo actual en el que se está ejecutando, pero si se ejecuta en Linux y genera código para Windows, es posible que no sea lo que busca. De lo contrario, no estoy seguro de a qué se referían los otros dos comentaristas.
Bill K
24

Si bien \nes el carácter de nueva línea correcto para los sistemas basados ​​en Unix, otros sistemas pueden usar diferentes caracteres para representar el final de una línea. En particular, el uso del sistema Windows \r\ny los primeros sistemas MacOS utilizados \r.

Al usar %nen su cadena de formato, le dice a Java que use el valor devuelto por System.getProperty("line.separator"), que es el separador de línea para el sistema actual.

Craig Putnam
fuente
18

Advertencia:

Si está haciendo código de RED, es posible que prefiera la certeza de \n, en lugar de %nque puede enviar diferentes caracteres a través de la red, dependiendo de la plataforma en la que se esté ejecutando.

George Forman
fuente
8

"correcto" depende de qué es exactamente lo que está tratando de hacer.

\ n siempre le dará un final de línea "estilo Unix". \ r \ n siempre le dará un final de línea "estilo dos". % n le dará el final de línea para la plataforma en la que está ejecutando

C maneja esto de manera diferente. Puede elegir abrir un archivo en modo "texto" o "binario". Si abre el archivo en modo binario, \ n le dará un final de línea "estilo unix" y "\ r \ n" le dará un final de línea "estilo dos". Si abre el archivo en modo "texto" en un sistema DOS / Windows, cuando escribe \ n, el código de manejo de archivos lo convierte a \ r \ n. Entonces, al abrir un archivo en modo texto y usar \ n, obtienes el final de línea específico de la plataforma.

Puedo ver por qué los diseñadores de Java no querían replicar las ideas hacky de C sobre los modos de archivo "texto" y "binario".

Peter Green
fuente
4

En Java, \nsiempre genere un \u000Acarácter de salto de línea. Para obtener el separador de línea correcto para un uso de plataforma particular%n .

Por lo tanto, utilícelo \ncuando esté seguro de que necesita un \u000Acarácter de salto de línea, por ejemplo, en redes.
En todas las demás situaciones utilice%n

Fathah Rehman P
fuente
4

Tenga en cuenta que estas respuestas solo son verdaderas cuando se usa System.out.printf()o System.out.format()o el Formatterobjeto. Si usa %nin System.out.println(), simplemente producirá una %n, no una nueva línea.

usuario1677663
fuente
0

El especificador de formato% n es un separador de líneas que es portátil en todos los sistemas operativos. Sin embargo, no se puede utilizar como argumento para las funciones System.out.print o System.out.println.

Siempre se recomienda utilizar esta nueva versión del separador de líneas anterior \ n.

Piyush Patel
fuente