Що відбувається з Java "% n" у printf?


107

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

Який «правильний»? Що не так \n? Чому Java змінила цю умову C?


1
Просто здогадка, але: кросплатформна підтримка. У різних системах використовуються різні символи для нових рядків, наприклад \ n відносно \ r \ n. C # має Environment.NewLine з тією ж метою.
Йорданія, що працює

У Java є щось і в System, але% n простіше у printf.
Пол Томблін

чому ява змінив цю умову c == +1, :)
Майкл Діммітт

Не зміна, доповнення / удосконалення. \ n все ще означає \ n
Білл К

(зверніть увагу на майбутніх читачів: C вже автоматично перетворюється \nна
нову строчку

Відповіді:


150

З швидкого Google:

Також є один специфікатор, який не відповідає аргументу. Саме "% n" видає розрив рядка. "\ N" також може використовуватися в деяких випадках, але оскільки "% n" завжди виводить правильний роздільний рядок, орієнтований на платформу, він переноситься на платформах, тоді як "\ n" - ні.

Зверніться до https://docs.oracle.com/javase/tutorial/java/data/numberformat.html

Першоджерело


@ user2864740 Це правда, він не виводить правильний роздільник ліній платформи, а поточний .
Хоуке Інгмар Шмідт

гмм, що це означає?
Калпеш Соні

Я вважаю, що він використовує одну для поточної ОС, на якій працює, але якщо вона працює на Linux і виводить код для Windows, можливо, це не те, що ви шукаєте. Я інакше не впевнений, про що можуть посилатися інші два коментатори.
Білл К


24

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

Використовуючи %nу своєму рядку формату, ви говорите Java використовувати значення, яке повертає System.getProperty("line.separator"), що є роздільником рядків для поточної системи.


18

Увага:

Якщо ви робите код NETWORKING, ви можете віддати перевагу визначеності \n, на відміну від того, %nяка може надсилати різні символи по всій мережі, залежно від того, на якій платформі вона працює.


8

"правильно" залежить від того, що саме ви намагаєтеся зробити.

\ n завжди надасть вам закінчення рядка "стиль унікс". \ r \ n завжди надасть вам закінчення рядка "стиль dos". % n дасть вам закінчення рядка для платформи, на якій ви працюєте

C справляється з цим по-різному. Ви можете відкрити файл у режимі "текст" або "двійковий". Якщо ви відкриєте файл у двійковому режимі \ n, ви отримаєте закінчення рядка "стиль унікс", а "\ r \ n" дасть вам закінчення рядка "стиль стилю". Якщо ви відкриєте файл у текстовому режимі в системі dos / windows, тоді, коли ви пишете \ n, код обробки файлів перетворює його на \ r \ n. Отже, відкриваючи файл у текстовому режимі та використовуючи \ n, ви закінчуєте певний рядок платформи.

Я можу зрозуміти, чому дизайнери Java не хотіли повторювати хиткі ідеї C щодо режимів "текст" та "бінарний файл".


4

У Java \nзавжди генерують \u000Aхарактер передачі ліній. Щоб отримати правильний роздільник ліній для конкретної платформи %n.

Тому використовуйте, \nколи ви впевнені, що вам потрібен \u000Aсимвол передачі ліній, наприклад, у мережі.
У всіх інших ситуаціях використовувати%n


4

Зверніть увагу на ці відповіді вірні лише при використанні System.out.printf()або System.out.format()або на Formatterоб'єкт. Якщо ви використовуєте %nв System.out.println(), він буде просто робити %n, а не символ нового рядка.


0

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

Завжди рекомендується використовувати цю нову версію роздільника рядків вище \ n.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.