Comment obtenir un nouveau caractère de ligne dépendant de la plateforme?


542

Comment obtenir une nouvelle ligne dépendante de la plate-forme en Java? Je ne peux pas l'utiliser "\n"partout.


Veuillez envisager de modifier les réponses acceptées. La 2e réponse est plus appropriée.
Gray

Réponses:


364

En plus de la propriété line.separator, si vous utilisez java 1.5 ou version ultérieure et String.format (ou d'autres méthodes de formatage ), vous pouvez utiliser %ncomme dans

Calendar c = ...;
String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY%n", c); 
//Note `%n` at end of line                                  ^^

String s2 = String.format("Use %%n as a platform independent newline.%n"); 
//         %% becomes %        ^^
//                                        and `%n` becomes newline   ^^

Voir l' API Java 1.8 pour Formatter pour plus de détails.


7
Je vous remercie! Je suis sûr que System.getProperty ("line.separator"); a ses utilisations, mais je me lasse de voir: "Line 1" + System.getProperty ("line.separator") + "Line 2"
Buttons840

43
Oh mon Dieu, "Line 1" + System.getProperty ("line.separator") + "Line 2" est en effet l'une des choses les plus laides que j'aie jamais vues. Le simple fait de déclarer une constante ailleurs serait moins douloureux.
abahgat

4
cela ne fonctionne pas, au moins, avec une chaîne entrant dans une instruction log4j. La création d'un exemple avec une nouvelle ligne à la fin cache potentiellement le problème. De plus, la chaîne s2 prête à confusion en utilisant '%% n'
Stealth Rabbi

6
Ne l'utilisez pas si votre chaîne peut contenir %des entrées utilisateur!
Konstantin Weitz

8
@KonstantinWeitz, le problème de String.format(s + "%n")est facilement résolu par String.format("%s%n", s). Il est toujours risqué d'impliquer la saisie de l'utilisateur comme corps de format (de la même manière que eval()).
Franklin Yu

710

Java 7 dispose désormais d'une System.lineSeparator()méthode.


8
Aurait été très gentil de leur part de fournir une méthode surchargée lineSeperator(int)qui renvoie un certain nombre de séparateurs de ligne, car je me retrouve souvent à utiliser 2 à la fois.
Kon

10
@Kon Basé sur cette réponse :String.join("", Collections.nCopies(5, System.lineSeparator()))
Samuel Harmer

4
Avec Java 11:System.lineSeparator().repeat(5)
Jacob

4
@JacobG Arrête de jubiler .. certains d'entre nous sont toujours bloqués sur Java 7.
Andrew T Finnell

@AndrewTFinnell Je trouverais un meilleur emploi <:-P Pas de conteneurs -> pas de Java 11, donc vous restez pour un meilleur salaire, nous pouvons nous réjouir :-D
Aubergine

650

Vous pouvez utiliser

System.getProperty("line.separator");

pour obtenir le séparateur de ligne


4
Vous voulez ajouter des System.lineSeparator()détails sur Java 7 alors voici une réponse définitive à cette question?
Gray

43

Si vous essayez d'écrire une nouvelle ligne dans un fichier, vous pouvez simplement utiliser la méthode newLine () de BufferedWriter .


31

Ceci est également possible: String.format("%n").

Ou String.format("%n").intern()pour économiser quelques octets.


7
C'est la même chose que la réponse d'Alex B.
Spoike

16
Oh maintenant je le vois. Il a écrit tellement de choses non traitées autour de sa réponse. ;-)
ceving

J'ai essayé de le faire, mais lorsque j'ai consulté le fichier dans le bloc-notes, il n'a pas reconnu la nouvelle ligne.
mr5

1
@ mr5 notepadn'est pas le bon outil pour afficher le contenu d'un fichier. Utilisez hexdumpou od.
ceving

@ceving Je suis dans un environnement Windows et je m'attendais à ce que la nouvelle ligne soit la combinaison de\r\n
mr5

22

La bibliothèque commons-lang a un champ constant disponible appelé SystemUtils.LINE_SEPARATOR


19
Oui, installez une bibliothèque tierce juste pour obtenir une nouvelle ligne indépendante de la plateforme! #facepalm
Shervin Asgari

23
@Shervin, bien sûr, vous ne le feriez pas, mais de nombreux projets sur lesquels j'ai travaillé utilisent déjà commons-lang et une ancienne version de Java. Donc, si vous utilisez déjà commons-lang, c'est une réponse sensée. Je n'ai pas jugé nécessaire de le signaler, j'avais manifestement tort.
lexicalscope

2
C'est en effet une bonne suggestion pour les projets qui utilisent déjà cette bibliothèque, merci!
Alexis Leclerc

13
StringBuilder newLine=new StringBuilder();
newLine.append("abc");
newline.append(System.getProperty("line.separator"));
newline.append("def");
String output=newline.toString();

L'extrait ci-dessus aura deux chaînes séparées par une nouvelle ligne indépendamment des plates-formes.



-3

Évitez d'ajouter des chaînes à l'aide de String + String, etc., utilisez plutôt StringBuilder.

String separator = System.getProperty( "line.separator" );
StringBuilder lines = new StringBuilder( line1 );
lines.append( separator );
lines.append( line2 );
lines.append( separator );
String result = lines.toString( );

20
En fait, cela n'a pas d'importance dans la plupart des cas, Jeff Atwood de Coding Horror a publié un blog sur ce type particulier de micro-optimisation . Effectuez toujours des mesures avant de faire des réclamations telles que «ne pas faire string + string».
Spoike

6
Je dirais que l'article de Jeff est peut-être un peu décalé car il ne concerne que le temps d'exécution. La concaténation de chaînes en Java ne concerne pas seulement la vitesse d'exécution, mais également la quantité de déchets que vous laissez en mémoire pour le GC à nettoyer, ce qui peut entraîner le GC plus souvent. Cela peut ou non être un problème selon votre environnement et votre configuration.
Lajcik

7
Lajcik, je soupçonne que c'est une pré-optimisation pour tous les cas, sauf ceux qui font vraiment beaucoup de manipulation de chaînes. Le StringBuffer est un anti-modèle pour les exigences de concaténation mineures. Dans de nombreux cas, je préfère avoir une chaîne lisible + séparateur + chaîne2 lisible que l'exemple multiligne susmentionné. En outre, je suggère de tester si la mémoire et le GC sont impactés positivement en ajoutant le SB. Dans de nombreux cas, je suppose que ce n'est pas le cas. Si cela ne vaut pas la peine d'être testé, c'est probablement une pré-optimisation et je me concentrerais sur la lisibilité.
Richard Watson

31
Faire un String1 + String2 est la même chose que faire un nouveau StringBuilder (String1) .append (String2) dans les compilateurs modernes, donc il n'y a aucune optimisation du tout pour un concat de chaîne à une ligne. StringBuilder n'en vaut généralement que pour les boucles ou les méthodes récursives. Mais de toute façon, cela pourrait être hors de la portée de la question initiale.
user327961

@ user327961: histoire vraie. On peut facilement le prouver en utilisant votre IDE préféré et un débogueur.
Atmocreations
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.