¿Cómo obtengo un nuevo carácter de línea dependiente de la plataforma?

542

¿Cómo obtengo una nueva línea dependiente de la plataforma en Java? No puedo usar en "\n"todas partes.

Spoike
fuente
Por favor considere cambiar las respuestas aceptadas. La segunda respuesta es más apropiada.
Gris

Respuestas:

364

Además de la propiedad line.separator, si está utilizando java 1.5 o posterior y String.format (u otros métodos de formato ) puede usar %ncomo en

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   ^^

Consulte la API de Java 1.8 para Formatter para obtener más detalles.

Alex B
fuente
77
¡Gracias! Estoy seguro de que System.getProperty ("line.separator"); tiene sus usos, pero me canso de ver: "Línea 1" + System.getProperty ("line.separator") + "Línea 2"
Botones840
43
Oh, "Line 1" + System.getProperty ("line.separator") + "Line 2" es de hecho una de las cosas más feas que he visto. Simplemente declarar una constante en otro lugar sería menos doloroso.
abahgat
44
esto no funciona, al menos, con una cadena que va a una declaración log4j. Crear un ejemplo con una nueva línea al final está potencialmente ocultando el problema. Además, el String s2 es confuso usando '%% n'
Stealth Rabbi
66
¡No use esto si su cadena puede contener información %del usuario!
Konstantin Weitz
8
@ KonstantinWeitz, el problema String.format(s + "%n")se resuelve fácilmente String.format("%s%n", s). Siempre es arriesgado involucrar la entrada del usuario como cuerpo del formato (de la misma manera que eval()).
Franklin Yu
710

Java 7 ahora tiene un System.lineSeparator()método.

StriplingWarrior
fuente
8
Hubiera sido muy amable de su parte proporcionar un método sobrecargado lineSeperator(int)que devuelva una cierta cantidad de separadores de línea, ya que a menudo me encuentro usando 2 a la vez.
Kon
10
@Kon Basado en esta respuesta :String.join("", Collections.nCopies(5, System.lineSeparator()))
Samuel Harmer
44
Con Java 11:System.lineSeparator().repeat(5)
Jacob G.
44
@JacobG Deja de regodearse ... algunos de nosotros todavía estamos atrapados en Java 7.
Andrew T Finnell
@AndrewTFinnell Encontraría un mejor trabajo <:-P Sin contenedores -> sin Java 11, por lo que se queda por un mejor salario, podemos regodearnos :-D
Berenjena
650

Puedes usar

System.getProperty("line.separator");

para obtener el separador de línea

abahgat
fuente
44
¿Le gustaría agregar System.lineSeparator()detalles de Java 7, así que aquí hay una respuesta definitiva a esta pregunta?
Gris
43

Si está intentando escribir una nueva línea en un archivo, simplemente puede usar el método newLine () de BufferedWriter .

Michael Myers
fuente
31

Esto también es posible: String.format("%n").

O String.format("%n").intern()para guardar algunos bytes.

ceving
fuente
77
Esto es lo mismo que la respuesta de Alex B.
Spoike
16
Oh ahora lo veo. Escribió muchas cosas sin preguntar en torno a su respuesta. ;-)
ceving
He intentado hacer esto, pero cuando vi el archivo en el bloc de notas, no reconoce la nueva línea.
mr5
1
@ mr5 notepadno es la herramienta adecuada para ver el contenido de un archivo. Use hexdumpo od.
ceving
@ceving Estoy en un entorno Windows y esperaba que la nueva línea fuera la combinación de\r\n
mr5
22

La biblioteca commons-lang tiene un campo constante disponible llamado SystemUtils.LINE_SEPARATOR

léxico
fuente
19
Sí, instale una biblioteca de terceros solo para obtener una nueva línea independiente de la plataforma. #facepalm
Shervin Asgari
23
@Shervin, por supuesto, no harías eso, pero muchos proyectos en los que he trabajado ya están usando commons-lang y alguna versión anterior de Java. Entonces, si ya estás usando commons-lang, entonces esta es una respuesta sensata. No sentí que fuera necesario señalar eso, obviamente estaba equivocado.
lexicalscope
2
De hecho, esta es una buena sugerencia para proyectos que ya están utilizando esta biblioteca, ¡gracias!
Alexis Leclerc
13
StringBuilder newLine=new StringBuilder();
newLine.append("abc");
newline.append(System.getProperty("line.separator"));
newline.append("def");
String output=newline.toString();

El fragmento anterior tendrá dos cadenas separadas por una nueva línea independientemente de las plataformas.

Sathesh Balakrishnan Manohar
fuente
13

Si está escribiendo en un archivo, usando una BufferedWriterinstancia, use el newLine()método de esa instancia. Proporciona una forma independiente de la plataforma para escribir la nueva línea en un archivo.

Damaji kalunge
fuente
1
Esta respuesta es un duplicado de la de Mike Meyers .
Agi Hammerthief
-3

Evite agregar cadenas usando String + String, etc., use StringBuilder en su lugar.

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
fuente
20
En realidad, esto no importa en la mayoría de los casos, Jeff Atwood de Coding Horror hizo una publicación de blog sobre este tipo particular de micro-optimización . Siempre haga métricas antes de hacer afirmaciones como "no hacer string + string".
Spoike
66
Yo diría que el artículo de Jeff puede estar un poco apagado ya que solo toca el tiempo de ejecución. La concatenación de cadenas en Java no solo se trata de la velocidad de ejecución, sino también de la cantidad de basura que queda en la memoria para que el GC limpie, lo que puede hacer que el GC se ejecute con más frecuencia. Esto puede o no ser un problema dependiendo de su entorno y configuración.
Lajcik
77
Lajcik, sospecho que es una optimización previa para todos los casos, excepto aquellos que realmente hacen mucha manipulación de cadenas. StringBuffer es un antipatrón para requisitos menores de concatenación. En muchos casos, prefiero tener String1 + separador + String2 legible que el ejemplo de varias líneas mencionado anteriormente. Además, sugeriría probar si la memoria y el GC se ven afectados positivamente al agregar el SB. En muchos casos, supongo que no lo es. Si no vale la pena probarlo, probablemente sea una optimización previa y me concentraría en la legibilidad.
Richard Watson el
31
Hacer un String1 + String2 es lo mismo que hacer un nuevo StringBuilder (String1) .append (String2) en los compiladores modernos, por lo que no hay optimización para un concat de cadena de un trazador de líneas. StringBuilder generalmente vale la pena solo en bucles o métodos recursivos. Pero de todos modos, esto podría estar fuera del alcance de la pregunta original.
user327961
@ user327961: historia real. Uno puede probar esto fácilmente usando su IDE favorito y un depurador.
Atmocreations