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.

Spoike
la source
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.

Alex B
la source
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.

StriplingWarrior
la source
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

abahgat
la source
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 .

Michael Myers
la source
31

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

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

ceving
la source
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

lexicalscope
la source
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.

Sathesh Balakrishnan Manohar
la source
13

Si vous écrivez dans un fichier à l'aide d'une BufferedWriterinstance, utilisez la newLine()méthode de cette instance. Il fournit un moyen indépendant de la plate-forme d'écrire la nouvelle ligne dans un fichier.

Damaji kalunge
la source
1
Cette réponse est un double de celle de Mike Meyers .
Agi Hammerthief
-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( );
Gary Davies
la source
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