Como obtenho um caractere de nova linha dependente da plataforma?

542

Como obtenho uma nova linha dependente da plataforma em Java? Eu não posso usar em "\n"todos os lugares.

Spoike
fonte
Por favor, considere alterar as respostas aceitas. A segunda resposta é mais apropriada.
Grey

Respostas:

364

Além da propriedade line.separator, se você estiver usando o java 1.5 ou posterior e o String.format (ou outros métodos de formatação ), poderá usar %ncomo em

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 a API Java 1.8 para Formatter para obter mais detalhes.

Alex B
fonte
7
Obrigado! Tenho certeza de que System.getProperty ("line.separator"); tem seus usos, mas eu me canso de ver: "Line 1" + System.getProperty ( "line.separator") + "Linha 2"
Buttons840
43
Oh meu Deus, "Linha 1" + System.getProperty ("line.separator") + "Linha 2" é realmente uma das coisas mais feias que eu já vi. Apenas declarar uma constante em outro lugar seria menos doloroso.
abahgat
4
isso não funciona, pelo menos, com uma string inserida em uma instrução log4j. Criar um exemplo com uma nova linha no final está escondendo o problema. Além disso, o String s2 é confuso usando '%% n'
Stealth Rabbi
6
Não use isso se sua string puder conter %da entrada do usuário!
Konstantin Weitz
8
@ KonstantinWeitz, o problema de String.format(s + "%n")é facilmente resolvido String.format("%s%n", s). É sempre arriscado envolver a entrada do usuário como corpo do formato (da mesma maneira que eval()).
Franklin Yu
710

O Java 7 agora tem um System.lineSeparator()método.

StriplingWarrior
fonte
8
Teria sido muito gentil da parte deles fornecer um método sobrecarregado lineSeperator(int)que retornasse um número de separadores de linha, pois geralmente me vejo usando 2 de uma vez.
Kon Kon
10
@Kon Com base nesta resposta :String.join("", Collections.nCopies(5, System.lineSeparator()))
Samuel Harmer
4
Com Java 11:System.lineSeparator().repeat(5)
Jacob G.
4
@JacobG Parar regozijando .. alguns de nós ainda estão presos em Java 7.
Andrew T Finnell
@AndrewTFinnell Eu encontraria um emprego melhor <:-P Sem contêineres -> sem Java 11, para que você fique com um salário melhor, podemos nos alegrar :-D
Beringela
650

Você pode usar

System.getProperty("line.separator");

para obter o separador de linha

abahgat
fonte
4
Gostaria de adicionar System.lineSeparator()detalhes do Java 7, então aqui está uma resposta definitiva para esta pergunta?
Grey
43

Se você estiver tentando escrever uma nova linha em um arquivo, você pode simplesmente usar o método newLine () do BufferedWriter .

Michael Myers
fonte
31

Isso também é possível: String.format("%n") .

Ou String.format("%n").intern()para salvar alguns bytes.

ceving
fonte
7
É o mesmo que a resposta de Alex B.
Spoike
16
Oh agora eu vejo. Ele escreveu tantas coisas não solicitadas em torno de sua resposta. ;-)
ceving 29/04
Eu tentei fazer isso, mas quando eu vi o arquivo no bloco de notas, ele não reconheceu a nova linha.
MR5
1
@ mr5 notepadnão é a ferramenta certa para visualizar o conteúdo de um arquivo. Use hexdumpou od.
ceving
@ceving Eu estou em um ambiente Windows e eu estava esperando a nova linha seria a combinação de\r\n
MR5
22

A biblioteca commons-lang tem um campo constante disponível chamado SystemUtils.LINE_SEPARATOR

lexicalscope
fonte
19
Sim, instale uma biblioteca de terceiros apenas para obter uma nova linha independente da plataforma! #facepalm
Shervin Asgari
23
@ Shervin, é claro que você não faria isso, mas muitos projetos nos quais trabalhei já estão usando o commons-lang e alguma versão mais antiga do Java. Portanto, se você já está usando o commons-lang, essa é uma resposta sensata. Não achei necessário salientar que estava obviamente errado.
Lexicalscope
2
Essa é realmente uma boa sugestão para projetos que já estão usando esta biblioteca, obrigado!
Alexis Leclerc
13
StringBuilder newLine=new StringBuilder();
newLine.append("abc");
newline.append(System.getProperty("line.separator"));
newline.append("def");
String output=newline.toString();

O snippet acima terá duas strings separadas por uma nova linha, independentemente das plataformas.

Sathesh Balakrishnan Manohar
fonte
13

Se você estiver gravando em um arquivo, usando uma BufferedWriterinstância, use o newLine()método dessa instância. Ele fornece uma maneira independente de plataforma de escrever a nova linha em um arquivo.

Damaji kalunge
fonte
1
Esta resposta é uma duplicata da de Mike Meyers .
Agi Hammerthief 23/08/18
-3

Evite anexar strings usando String + String etc, use 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
fonte
20
Na verdade, isso não importa na maioria dos casos, Jeff Atwood , da Coding Horror, fez um post no blog sobre esse tipo específico de micro-otimização . Sempre faça métricas antes de fazer reivindicações como "não faça string + string".
Spoike
6
Eu diria que o artigo de Jeff pode estar um pouco errado, uma vez que apenas toca no tempo de execução. A concatenação de cadeias de caracteres em Java não se refere apenas à velocidade de execução, mas também à quantidade de lixo que você deixa na memória para a limpeza do GC, o que pode resultar na execução mais frequente do GC. Isso pode ou não ser um problema, dependendo do seu ambiente e configuração.
Lajcik
7
Lajcik, suspeito que isso seja pré-otimizado para todos os casos, exceto aqueles que realmente fazem muita manipulação de strings. O StringBuffer é um antipadrão para requisitos de concatenação menores. Em muitos casos, eu preferiria ter String1 + separador + String2 legível do que o exemplo de várias linhas acima mencionado. Além disso, sugiro testar se a memória e o GC são impactados positivamente adicionando o SB. Em muitos casos, acho que não é. Se não vale a pena testar, provavelmente está pré-otimizando e eu me concentraria na legibilidade.
Richard Watson
31
Fazer uma String1 + String2 é o mesmo que fazer um novo StringBuilder (String1) .append (String2) em compiladores modernos, portanto, não há otimização para uma concat de uma cadeia de liner. Geralmente, o StringBuilder vale a pena apenas em loops ou métodos recursivos. De qualquer forma, isso pode estar fora do escopo da pergunta original.
User327961
@ user327961: história verdadeira. Pode-se facilmente provar isso usando seu IDE favorito e um depurador.
Atmocreations