Як отримати новий символ рядка, залежний від платформи?


542

Як отримати платформу, що залежить від платформи, на Java? Я не можу використовувати "\n"всюди.


Будь ласка, подумайте про зміну прийнятих відповідей. 2-а відповідь більш відповідна.
Сірий

Відповіді:


363

На додаток до властивості line.separator, якщо ви використовуєте java 1.5 або пізнішої версії, а також String.format (або інші методи форматування ) ви можете використовувати %nяк у

Calendar c = ...;
String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY%n", c); 
//Note `%n` at end of line                                  ^^

String s2 = String.format("Use %%n as a platform independent newline.%n"); 
//         %% becomes %        ^^
//                                        and `%n` becomes newline   ^^

Докладніші відомості див. У API API 1.8 для Форматтера .


7
Дякую! Я впевнений, System.getProperty ("line.separator"); має використання, але я втомився бачити: "Рядок 1" + System.getProperty ("line.separator") + "Рядок 2"
кнопки840

43
О мій, "Рядок 1" + System.getProperty ("line.separator") + "Рядок 2" - це справді одна з найпотворніших речей, які я коли-небудь бачив. Просто оголосити константу в іншому місці було б менш болісно.
abahgat

4
це не працює, принаймні, із рядком, що надходить до оператора log4j. Створення прикладу з новим рядком наприкінці потенційно приховує проблему. Крім того, String s2 просто заплутано, використовуючи '%% n'
Stealth Rabbi

6
Не використовуйте це, якщо ваша рядок може містити дані %користувача!
Костянтин Вайц

8
@KonstantinWeitz, проблему String.format(s + "%n")легко вирішити String.format("%s%n", s). Завжди ризиковано включати введення користувача як тіло формату (так само, як eval()).
Франклін Ю

709

У Java 7 тепер є System.lineSeparator()метод.


8
Було б дуже приємно з них надати перевантажений метод, lineSeperator(int)який повертає деяку кількість сепараторів рядків, оскільки я часто можу використовувати 2 одночасно.
Кон-

10
@Kon Виходячи з цієї відповіді :String.join("", Collections.nCopies(5, System.lineSeparator()))
Самуель Хармер

4
З Явою 11:System.lineSeparator().repeat(5)
Яків Г.

4
@JacobG Перестаньте шалівати. Деякі з нас досі
тримаються

@AndrewTFinnell Я знайшов би кращу роботу <:-P Без контейнерів -> немає Java 11, тому ви залишаєтесь за кращу зарплату, ми можемо похвалитись :-D
Баклажан

649

Можна використовувати

System.getProperty("line.separator");

щоб отримати роздільник рядків


4
Хочете додати System.lineSeparator()деталі Java 7, щоб ось остаточна відповідь на це питання?
Сірий


31

Це також можливо: String.format("%n") .

Або String.format("%n").intern()зберегти кілька байт.


7
Це те саме, що відповідь Алекса Б.
Спойк

16
О, тепер я це бачу. Навколо своєї відповіді він написав стільки неприпитаних речей. ;-)
ceving

Я спробував це зробити, але коли я переглянув файл у блокноті, він не розпізнав новий рядок.
mr5

1
@ mr5 notepadне є правильним інструментом для перегляду вмісту файлу. Використовуйте hexdumpабо od.
закінчення

@ceving Я в середовищі Windows, і я очікував, що новий рядок буде поєднанням\r\n
mr5

22

The Commons-lang має постійне поле під назвою SystemUtils.LINE_SEPARATOR


19
Так, встановіть сторонню бібліотеку лише для того, щоб отримати новий незалежний платформа! #facepalm
Shervin Asgari

23
@Shervin, звичайно, ви б цього не зробили, але багато проектів, над якими я працював, вже використовують commons-lang та старішу версію Java. Тож якщо ви випадково вже використовуєте commons-lang, то це розумна відповідь. Я не вважав за потрібне це вказувати, я, очевидно, помилявся.
лексикаскоп

2
Це справді гарна пропозиція для проектів, які вже використовують цю бібліотеку, дякую!
Алексіс Леклерк

13
StringBuilder newLine=new StringBuilder();
newLine.append("abc");
newline.append(System.getProperty("line.separator"));
newline.append("def");
String output=newline.toString();

Вищенаведений фрагмент матиме два рядки, розділені новою лінією незалежно від платформи.



-3

Уникайте додавання рядків за допомогою String + String тощо, використовуйте StringBuilder.

String separator = System.getProperty( "line.separator" );
StringBuilder lines = new StringBuilder( line1 );
lines.append( separator );
lines.append( line2 );
lines.append( separator );
String result = lines.toString( );

20
Це насправді не має значення в більшості випадків, Джефф Етвуд, що кодує хоррори, зробив публікацію в блозі про саме такий тип мікрооптимізації . Завжди робіть показники перед тим, як пред'являти претензії типу "не робити string + string".
Спіке

6
Я б сказав, що стаття Джеффа, можливо, трохи недооцінена, оскільки стосується лише часу виконання. Зв'язок рядків у Java - це не лише швидкість виконання, але й кількість сміття, яке ви залишаєте в пам'яті для очищення GC, що може призвести до того, що GC запускається частіше. Це може бути, а може не бути проблемою, залежно від середовища та конфігурації.
Лайцік

7
Лайцік, я підозрюю, що це попередня оптимізація для всіх випадків, за винятком тих, хто дійсно робить багато маніпуляцій із струнами. StringBuffer - це анти-шаблон для незначних вимог до конкатенації. У багатьох випадках я вважаю за краще читати String1 + роздільник + String2, ніж згаданий вище рядковий приклад. Окрім того, я б запропонував перевірити, чи впливає на пам'ять та на GC позитивне додавання SB. У багатьох випадках я думаю, що це не так. Якщо тестування не варто, це, мабуть, попередня оптимізація, і я зосередився б на читанні.
Річард Уотсон

31
Зробити String1 + String2 - це те саме, що зробити новий StringBuilder (String1) .append (String2) у сучасних компіляторах, тому оптимізація для одного контуру рядка вкладиша взагалі не відбувається. StringBuilder загалом варто цього лише в циклі або рекурсивних методах. Але в будь-якому випадку це може бути поза рамками початкового питання.
користувач327961

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