O que há com “% n” do Java em printf?

107

Estou lendo Effective Java e ele usa %npara o caractere de nova linha em todos os lugares. Tenho usado com \nbastante sucesso para newline em programas Java.

Qual é o 'correto'? O que há de errado \n? Por que o Java mudou essa convenção C?

ripper234
fonte
1
Só um palpite, mas: Suporte multiplataforma. Sistemas diferentes usam caracteres diferentes para novas linhas, por exemplo, \ n vs. \ r \ n. C # tem Environment.NewLine para o mesmo propósito.
Jordan em execução em
Java também tem algo em System, mas% n é mais fácil em um printf.
Paul Tomblin
por que java mudou esta convenção c == +1, :)
Michael Dimmitt
Não é uma mudança, uma adição / aprimoramento. \ n ainda significa \ n
Bill K,
(observação para leitores futuros: C já é convertido automaticamente \npara nova linha específica da plataforma em formato de texto, veja isso , o Java não)
user202729

Respostas:

150

De um rápido google:

Também existe um especificador que não corresponde a um argumento. É "% n" que produz uma quebra de linha. Um "\ n" também pode ser usado em alguns casos, mas como "% n" sempre exibe o separador de linha específico da plataforma correto, ele é portátil entre plataformas, enquanto "\ n" não é.

Consulte https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

Fonte original

Bill K
fonte
@ user2864740 É verdade, ele não mostra o separador de linha específico da plataforma correto , mas o atual .
Hauke ​​Ingmar Schmidt
umm, o que isso significa?
Kalpesh Soni
Eu acredito que ele usa aquele para o sistema operacional atual em que está rodando, mas se estiver rodando no Linux e gerando código para o Windows, pode não ser o que você está procurando. Por outro lado, não tenho certeza do que os outros dois comentaristas podem estar se referindo.
Bill K
24

Embora \nseja o caractere de nova linha correto para sistemas baseados em Unix, outros sistemas podem usar caracteres diferentes para representar o fim de uma linha. Em particular, o uso do sistema Windows \r\ne os primeiros sistemas MacOS usados \r.

Ao usar %nem sua string de formato, você diz ao Java para usar o valor retornado por System.getProperty("line.separator"), que é o separador de linha para o sistema atual.

Craig Putnam
fonte
18

Aviso:

Se você estiver fazendo código NETWORKING, você pode preferir a certeza de \n, em vez de %nenviar caracteres diferentes pela rede, dependendo da plataforma em que está sendo executado.

George Forman
fonte
8

"correto" depende do que exatamente você está tentando fazer.

\ n sempre fornecerá um final de linha "estilo unix". \ r \ n sempre fornecerá um final de linha "estilo dos". % n fornecerá o final da linha para a plataforma em que você está executando

C lida com isso de forma diferente. Você pode escolher abrir um arquivo no modo "texto" ou "binário". Se você abrir o arquivo no modo binário, \ n terá um final de linha "estilo unix" e "\ r \ n" fornecerá um final de linha "estilo dos". Se você abrir o arquivo no modo "texto" em um sistema DOS / Windows, quando você escrever \ n, o código de manipulação do arquivo o converterá em \ r \ n. Portanto, abrindo um arquivo em modo de texto e usando \ n, você obtém o final de linha específico da plataforma.

Posso ver por que os designers de java não queriam replicar as idéias hacky de C em relação aos modos de arquivo "texto" e "binário".

Peter Green
fonte
4

Em java, \nsempre gere o \u000Acaractere de avanço de linha. Para obter o separador de linha correto para uso particular da plataforma %n.

Portanto, use \nquando tiver certeza de que precisa do \u000Acaractere de avanço de linha, por exemplo, em redes.
Em todas as outras situações, use%n

Fathah Rehman P
fonte
4

Observe que essas respostas são verdadeiras apenas ao usar System.out.printf()ou System.out.format()ou o Formatterobjeto. Se você usar %nem System.out.println(), ele simplesmente produzirá uma %n, não uma nova linha.

user1677663
fonte
0

O especificador de formato% n é um separador de linha portátil entre sistemas operacionais. No entanto, ele não pode ser usado como um argumento para as funções System.out.print ou System.out.println.

É sempre recomendável usar esta nova versão do separador de linha acima de \ n.

Piyush Patel
fonte