Que se passe-t-il avec le «% n» de Java dans printf?

107

Je lis Effective Java et il utilise %npartout le caractère de nouvelle ligne. J'ai utilisé \nplutôt avec succès pour la nouvelle ligne dans les programmes Java.

Quelle est la «bonne»? Quel est le problème avec \n? Pourquoi Java a-t-il changé cette convention C?

ripper234
la source
1
Juste une supposition, mais: Prise en charge multiplateforme. Différents systèmes utilisent des caractères différents pour les sauts de ligne, par exemple \ n contre \ r \ n. C # a Environment.NewLine dans le même but.
Jordan Running
Java a aussi quelque chose dans System, mais% n est plus facile dans un printf.
Paul Tomblin
pourquoi java a-t-il changé cette convention c == +1, :)
Michael Dimmitt
Pas un changement, un ajout / une amélioration. \ n signifie toujours \ n
Bill K
(note aux futurs lecteurs: C déjà converti automatiquement \nen nouvelle ligne spécifique à la plate-forme au format texte, voyez ceci , Java ne le fait pas)
user202729

Réponses:

150

D'un google rapide:

Il existe également un spécificateur qui ne correspond pas à un argument. C'est "% n" qui produit un saut de ligne. Un "\ n" peut également être utilisé dans certains cas, mais comme "% n" affiche toujours le séparateur de ligne spécifique à la plate-forme, il est portable sur toutes les plates-formes alors que "\ n" ne l'est pas.

Veuillez vous référer à https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

Source primaire

Bill K
la source
@ user2864740 C'est vrai, il ne génère pas le séparateur de ligne correct spécifique à la plate-forme, mais celui actuel .
Hauke ​​Ingmar Schmidt
umm, qu'est-ce que ça veut dire?
Kalpesh Soni
Je crois qu'il utilise celui du système d'exploitation actuel sur lequel il fonctionne, mais s'il fonctionne sous Linux et produit du code pour Windows, ce n'est peut-être pas ce que vous recherchez. Je ne suis pas sûr de ce à quoi les deux autres commentateurs ont fait allusion.
Bill K
24

Bien que ce \nsoit le caractère de nouvelle ligne correct pour les systèmes Unix, d'autres systèmes peuvent utiliser des caractères différents pour représenter la fin d'une ligne. En particulier, l'utilisation du système Windows \r\net les premiers systèmes MacOS utilisés \r.

En utilisant %ndans votre chaîne de format, vous indiquez à Java d'utiliser la valeur renvoyée par System.getProperty("line.separator"), qui est le séparateur de ligne pour le système actuel.

Craig Putnam
la source
18

Avertissement:

Si vous utilisez du code NETWORKING, vous préférerez peut-être la certitude de \n, par opposition à %nlaquelle peut envoyer différents caractères sur le réseau, en fonction de la plate-forme sur laquelle il s'exécute.

George Forman
la source
8

«correct» dépend de ce que vous essayez de faire exactement.

\ n vous donnera toujours une fin de ligne de "style unix". \ r \ n vous donnera toujours une fin de ligne "style dos". % n vous donnera la fin de ligne pour la plate-forme sur laquelle vous utilisez

C gère cela différemment. Vous pouvez choisir d'ouvrir un fichier en mode «texte» ou «binaire». Si vous ouvrez le fichier en mode binaire \ n vous donnera une fin de ligne "style unix" et "\ r \ n" vous donnera une fin de ligne "style dos". Si vous ouvrez le fichier en mode "texte" sur un système dos / windows, lorsque vous écrivez \ n le code de gestion de fichier le convertit en \ r \ n. Ainsi, en ouvrant un fichier en mode texte et en utilisant \ n, vous obtenez la fin de ligne spécifique à la plate-forme.

Je peux voir pourquoi les concepteurs de java ne voulaient pas reproduire les idées hacky de C concernant les modes de fichiers "texte" et "binaire".

Peter Green
la source
4

En java, \ngénérez toujours un \u000Acaractère de saut de ligne. Pour obtenir le séparateur de ligne correct pour une utilisation particulière de la plate-forme %n.

Utilisez donc \nlorsque vous êtes sûr que vous avez besoin de \u000Acaractères de saut de ligne, par exemple en réseau.
Dans toutes les autres situations, utilisez%n

Fathah Rehman P
la source
4

Notez que ces réponses ne sont vraies que lorsque vous utilisez System.out.printf()ou System.out.format()ou l' Formatterobjet. Si vous utilisez %nin System.out.println(), cela produira simplement un %n, pas une nouvelle ligne.

user1677663
la source
0

Le spécificateur de format% n est un séparateur de ligne portable sur tous les systèmes d'exploitation. Cependant, il ne peut pas être utilisé comme argument des fonctions System.out.print ou System.out.println.

Il est toujours recommandé d'utiliser cette nouvelle version du séparateur de ligne ci-dessus \ n.

Piyush Patel
la source