Что случилось с Java "% n" в printf?

107

Я читаю «Эффективную Java», и %nвезде используется символ новой строки. Я \nдовольно успешно использовал перевод строки в программах на Java.

Какой из них «правильный»? Что не так \n? Почему Java изменила это соглашение о C?

потрошитель234
источник
1
Только предположение, но: кроссплатформенная поддержка. В разных системах для перевода строки используются разные символы, например \ n против \ r \ n. В C # для той же цели есть Environment.NewLine.
Jordan Running
У Java тоже есть кое-что в System, но% n проще в printf.
Пол Томблин,
почему java изменила это соглашение c == +1, :)
Майкл Диммитт
Не изменение, а дополнение / улучшение. \ n по-прежнему означает \ n
Билл К.
(примечание для будущих читателей: C уже автоматически конвертирует \nновую строку в текстовый формат для конкретной платформы, см. это , Java этого не делает)
user202729

Ответы:

150

Из быстрого Google:

Также есть один спецификатор, который не соответствует аргументу. Это "% n", которое выводит разрыв строки. В некоторых случаях также можно использовать "\ n", но поскольку "% n" всегда выводит правильный разделитель строк, зависящий от платформы, он переносится между платформами, а "\ n" - нет.

См. Https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

Первоисточник

Билл К
источник
@ user2864740 Это правда, он выводит не правильный разделитель строк для конкретной платформы, а текущий .
Хауке Ингмар Шмидт
ммм, что это значит?
Kalpesh Soni
Я считаю, что он использует тот, который используется в текущей ОС, но если он работает в Linux и выводит код для Windows, это может быть не то, что вам нужно. Я не совсем уверен, что могли иметь в виду два других комментатора.
Bill K
24

Хотя \nэто правильный символ новой строки для систем на базе Unix, другие системы могут использовать другие символы для обозначения конца строки. В частности, использовались системы Windows \r\nи ранние системы MacOS \r.

Используя %nв своей строке формата, вы указываете Java использовать значение, возвращаемое System.getProperty("line.separator"), которое является разделителем строк для текущей системы.

Крейг Патнэм
источник
18

Предупреждение:

Если вы выполняете СЕТЕВОЙ код, вы можете предпочесть определенность \n, в отличие от того, %nчто может отправлять разные символы по сети, в зависимости от того, на какой платформе он работает.

Джордж Форман
источник
8

«правильный» зависит от того, что именно вы пытаетесь сделать.

\ n всегда будет давать окончание строки в стиле "unix". \ r \ n всегда будет давать вам окончание строки в стиле "dos". % n даст вам конец строки для платформы, на которой вы работаете

C обрабатывает это иначе. Вы можете открыть файл в «текстовом» или «двоичном» режиме. Если вы откроете файл в двоичном режиме, \ n даст вам окончание строки в стиле "unix", а "\ r \ n" даст вам окончание строки в стиле dos. Если вы открываете файл в «текстовом» режиме в системе dos / windows, тогда, когда вы пишете \ n, код обработки файла преобразует его в \ r \ n. Итак, открыв файл в текстовом режиме и используя \ n, вы получите окончание строки, зависящей от платформы.

Я понимаю, почему разработчики java не хотели копировать хакерские идеи C относительно "текстового" и "двоичного" файловых режимов.

Питер Грин
источник
4

В java \nвсегда \u000Aсоздавайте символ перевода строки. Чтобы получить правильный разделитель строк для конкретной платформы %n.

Поэтому используйте, \nесли вы уверены, что вам нужен \u000Aсимвол перевода строки, например, в сети.
Во всех остальных ситуациях используйте%n

Фатх Рехман П.
источник
4

Обратите внимание, что эти ответы верны только при использовании System.out.printf()или System.out.format()или Formatterобъекта. Если вы используете %nin System.out.println(), он просто создаст a %n, а не новую строку.

user1677663
источник
0

Спецификатор формата% n - это разделитель строк, переносимый между операционными системами. Однако его нельзя использовать в качестве аргумента для функций System.out.print или System.out.println.

Всегда рекомендуется использовать эту новую версию разделителя строк над \ n.

Пиюш Патель
источник