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


107

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

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


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, а не новую строку.


0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.