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?


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


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


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.


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


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


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.