Как получить зависимый от платформы символ новой строки?

542

Как получить зависимую от платформы новую строку в Java? Я не могу использовать "\n"везде.

Spoike
источник
Пожалуйста, подумайте об изменении принятых ответов. Второй ответ более уместен.
Серый

Ответы:

364

В дополнение к свойству 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 Java 1.8 для Formatter для получения дополнительной информации.

Алекс Б
источник
7
Спасибо! Я уверен, что System.getProperty ("line.separator"); имеет свои применения, но я устал от просмотра: «Строка 1» + System.getProperty («line.separator») + «Строка 2»
Buttons840
43
Боже мой, "Строка 1" + System.getProperty ("line.separator") + "Строка 2" - действительно одна из самых уродливых вещей, которые я когда-либо видел. Простое объявление константы в другом месте было бы менее болезненным.
Абахгат
4
по крайней мере, это не работает со строкой, входящей в оператор log4j. Создание примера с новой строкой в ​​конце может скрыть проблему. Кроме того, строка s2 просто сбивает с толку, используя «%% n»
Stealth Rabbi
6
Не используйте это, если ваша строка может содержать %пользовательский ввод!
Константин Вайц
8
@KonstantinWeitz, проблема String.format(s + "%n")легко решается String.format("%s%n", s). Всегда рискованно включать пользовательский ввод в качестве тела формата (так же, как eval()).
Франклин Ю
710

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

StriplingWarrior
источник
8
Было бы очень мило с их стороны предоставить перегруженный метод, lineSeperator(int)который возвращает некоторое количество разделителей строк, поскольку я часто использую 2 сразу.
Кон
10
@Kon Основано на ответе :String.join("", Collections.nCopies(5, System.lineSeparator()))
Сэмюэль Хармер
4
С Java 11:System.lineSeparator().repeat(5)
Джейкоб Г.
4
@JacobG Хватит злорадствовать ... некоторые из нас все еще застряли на Java 7.
Andrew T Finnell
@AndrewTFinnell Я бы нашел лучшую работу <:-P Нет контейнеров -> нет Java 11, так что вы остаетесь за лучшую зарплату, мы можем злорадствовать :-D
Баклажан
650

Ты можешь использовать

System.getProperty("line.separator");

получить разделитель строк

abahgat
источник
4
Хотите добавить System.lineSeparator()подробности о Java 7, так что вот вам окончательный ответ на этот вопрос?
Серый
43

Если вы пытаетесь записать новую строку в файл, вы можете просто использовать метод BufferedWriter newLine () .

Майкл Майерс
источник
31

Это также возможно: String.format("%n").

Или String.format("%n").intern()сохранить несколько байтов.

ceving
источник
7
Это так же, как ответ Алекса Б.
Спойк
16
Ох, теперь я вижу это. Он написал так много незаданных вопросов вокруг своего ответа. ;-)
ceving
Я пытался сделать это, но когда я просмотрел файл в блокноте, он не распознал новую строку.
н 5
1
@ mr5 notepadне подходит для просмотра содержимого файла. Используйте hexdumpили od.
празднование
@ceving Я нахожусь в среде Windows, и я ожидал, что \r\n
новая строка
22

Библиотека commons-lang имеет постоянное доступное поле с именем SystemUtils.LINE_SEPARATOR

lexicalscope
источник
19
Да, установить стороннюю библиотеку, чтобы получить новую платформу независимо от платформы! #facepalm
Шервин Аскари
23
@ Шервин, конечно, вы бы этого не сделали, но многие проекты, над которыми я работал, уже используют commons-lang и некоторые более старые версии Java. Так что если вы уже используете commons-lang, то это разумный ответ. Я не чувствовал необходимости указывать на это, я был явно неправ.
lexicalscope
2
Это действительно хорошее предложение для проектов, которые уже используют эту библиотеку, спасибо!
Алексис Леклерк
13
StringBuilder newLine=new StringBuilder();
newLine.append("abc");
newline.append(System.getProperty("line.separator"));
newline.append("def");
String output=newline.toString();

Вышеупомянутый фрагмент будет иметь две строки, разделенные новой строкой, независимо от платформы.

Сатеш Балакришнан Манохар
источник
13

Если вы пишете в файл, используя BufferedWriterэкземпляр, используйте newLine()метод этого экземпляра. Он обеспечивает независимый от платформы способ записи новой строки в файл.

Дамаджи Калунге
источник
1
Этот ответ является дубликатом Майка Мейерса .
Agi Hammerthief
-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
Это на самом деле не имеет значения в большинстве случаев, Джефф Этвуд из Coding Horror сделал сообщение в блоге об этой конкретной микрооптимизации . Всегда делайте метрики, прежде чем делать заявления, такие как «не делайте string + string».
Spoike
6
Я бы сказал, что статья Джеффа может быть немного неуместной, поскольку она касается только времени исполнения. Конкатенация строк в Java зависит не только от скорости выполнения, но и от того, сколько мусора вы оставляете в памяти для очистки GC, что может привести к более частой работе GC. Это может или не может быть проблемой в зависимости от вашей среды и конфигурации.
Лайчик
7
Лайчик, я подозреваю, что это предварительная оптимизация для всех случаев, кроме тех, кто действительно много манипулирует строками. StringBuffer - это анти-шаблон для небольших требований конкатенации. Во многих случаях я предпочел бы иметь читаемый String1 + separator + String2, чем вышеупомянутый многострочный пример. Кроме того, я бы посоветовал проверить, влияет ли память и GC положительно, добавив SB. Во многих случаях я предполагаю, что это не так. Если тестирование не стоит, возможно, оно предварительно оптимизировано, и я бы сосредоточился на удобочитаемости.
Ричард Уотсон
31
Выполнение String1 + String2 - это то же самое, что и создание нового StringBuilder (String1) .append (String2) в современных компиляторах, поэтому оптимизация для конкатата с одной строкой вообще отсутствует. StringBuilder в целом стоит только в циклах или рекурсивных методах. Но в любом случае, это может быть за рамками первоначального вопроса.
user327961
@ user327961: правдивая история. Это легко доказать, используя вашу любимую IDE и отладчик.
Atmocreations