143 votes

Qu'est-ce qui se passe avec le "%n" de Java dans printf ?

Je suis en train de lire Effective Java et il utilise %n pour le caractère de retour à la ligne partout. J'ai utilisé \n plutôt avec succès pour le retour à la ligne dans les programmes Java.

Laquelle est la "bonne" ? Qu'est-ce qui ne va pas avec \n ? Pourquoi Java a-t-il modifié cette convention C ?

1 votes

Ce n'est qu'une supposition, mais.. : Support multiplateforme. Des systèmes différents utilisent des caractères différents pour les nouvelles lignes, par exemple \n vs. \r\n. C# a Environment.NewLine pour le même objectif.

0 votes

Java a également quelque chose dans System, mais %n est plus facile dans un printf.

1 votes

Pourquoi java a changé cette convention == +1, :)

196voto

Bill K Points 32115

D'après une rapide recherche sur Google :

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

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

Source originale

1 votes

@user2864740 C'est vrai, il n'y a pas d'affichage de l'élément correctes séparateur de ligne spécifique à la plate-forme, mais le séparateur de ligne actuel un.

1 votes

Humm, qu'est-ce que cela signifie ?

2 votes

Je crois qu'il utilise celui du système d'exploitation sur lequel il tourne, mais s'il tourne sous Linux et qu'il 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 pu faire référence.

41voto

Gregory Pakosz Points 35546

%n est portable d'une plate-forme à l'autre \n ne l'est pas.

Voir le la syntaxe des chaînes de formatage dans la documentation de référence :

Séparateur de ligne "n séparateur de ligne spécifique à la plate-forme

1 votes

29voto

Craig Putnam Points 166

Tandis que \n est le caractère de retour à la ligne correct pour les systèmes basés sur Unix, d'autres systèmes peuvent utiliser des caractères différents pour représenter la fin d'une ligne. En particulier, les systèmes Windows utilisent \r\n et les premiers systèmes MacOS utilisaient \r .

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

24voto

George Forman Points 61

Avertissement :

Si vous faites du code de RÉSEAU, vous pouvez préférer la certitude de \n par opposition à %n qui peut envoyer des caractères différents sur le réseau, en fonction de la plate-forme sur laquelle il fonctionne.

9voto

Peter Green Points 91

Le terme "correct" dépend de ce que vous essayez de faire exactement.

\n vous donnera toujours une fin de ligne "style Unix". \r\n vous donnera toujours une fin de ligne de type "dos". %n vous donnera la fin de ligne correspondant à la plate-forme sur laquelle vous travaillez.

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

Je comprends pourquoi les concepteurs de Java n'ont pas voulu reproduire les idées bizarres de C concernant les modes de fichiers "texte" et "binaire".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X