¿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.


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.


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.


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


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


31

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

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


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


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.



-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( );

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.