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

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

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

Gray 06.07.2018 18:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
554
1
435 035
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

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

System.getProperty("line.separator");

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

Не забудьте добавить детали Java 7 System.lineSeparator(), чтобы дать окончательный ответ на этот вопрос?

Gray 06.07.2018 19:11
Ответ принят как подходящий

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

Спасибо! Я уверен, что System.getProperty ("line.separator"); есть свое применение, но я устал видеть: «Строка 1» + System.getProperty («line.separator») + «Строка 2»

Buttons840 27.08.2011 02:02

О боже, «Строка 1» + System.getProperty («line.separator») + «Строка 2» действительно одна из самых уродливых вещей, которые я когда-либо видел. Было бы менее болезненно просто объявить константу в другом месте.

abahgat 16.12.2011 14:56

это не работает, по крайней мере, со строкой, входящей в оператор log4j. Создание примера с новой строкой в ​​конце потенциально скрывает проблему. Кроме того, String s2 просто сбивает с толку, используя '%% n'

Stealth Rabbi 10.05.2013 19:02

@StealthRabbi В (по крайней мере) C-подобных языках принято `` экранировать escape-символ '' для вставки буквального символа, например . \\ . (без точек) создает одиночную обратную косую черту, а %% дает одиночный %.

Sean Allred 06.08.2013 19:03

Не используйте это, если ваша строка может содержать % из пользовательского ввода!

Konstantin Weitz 13.11.2013 01:09

@SeanAllred, это правда ... но я думаю, что @StealthRabbi говорил, что в приведенном выше примере (по крайней мере, при первом чтении) неясно, что должен означать %%n. В любом случае форматированный текст должен читать "Use %n as a platform independent newline." с символом новой строки в конце.

hotshot309 03.12.2013 23:07

@KonstantinWeitz - Почему бы и нет? Подпрограммы форматирования не выполняют двойную обработку форматных замен.

Ted Hopp 29.12.2013 20:40

@Ted Hopp, если s - это строка, предоставленная пользователем, вы не должны использовать ее в строке формата, например format(s+"%n"), потому что, если s содержит %, это не удастся. В качестве аргументов формата можно использовать строки, предоставленные пользователем.

Konstantin Weitz 29.12.2013 23:32

@KonstantinWeitz - Что ж, использование строки, предоставленной пользователем, всегда рискованно. Приведенный вами пример завершится ошибкой только в том случае, если строка содержит неэкранированный % в качестве последнего символа. Но в этом случае формат будет недопустимым, если вы используете s+"\n". (Что бы вы предпочли, когда пользователь предоставляет такую ​​строку формата - исключение или отсутствующую новую строку? Я думаю, что это подбрасывание.)

Ted Hopp 30.12.2013 00:24

Если вы создаете String и используете разрывы строк для разделения строк, вы хотите проверить, не является ли ваш текст пустым, чтобы у вас не получились просто разрывы строк. В противном случае это хороший совет!

pyb 30.06.2015 18:59

@abahgat Да, но здесь мы говорим о Java, где многословие ценится гораздо выше элегантности или лаконичности.

Basic 10.12.2015 15:58

@KonstantinWeitz, проблема String.format(s + "%n") легко решается String.format("%s%n", s). Всегда рискованно использовать вводимые пользователем данные в качестве тела формата (так же, как eval()).

Franklin Yu 05.05.2016 07:11

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

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

Этот ответ - дубликат Майка Мейерса.

Agi Hammerthief 23.08.2018 10:51

В библиотеке Commons-lang есть поле констант, которое называется SystemUtils.LINE_SEPARATOR.

Да, установите стороннюю библиотеку, чтобы получить независимую от платформы новую строку! #facepalm

Shervin Asgari 07.01.2014 15:37

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

lexicalscope 07.01.2014 20:06

Это действительно хорошее предложение для проектов, которые уже используют эту библиотеку, спасибо!

Alexis Leclerc 06.03.2014 20:19

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

Было бы очень хорошо с их стороны предоставить перегруженный метод lineSeperator(int), который возвращает некоторое количество разделителей строк, поскольку я часто использую сразу 2.

Kon 12.03.2016 02:22

@Kon На основе этот ответ: String.join("", Collections.nCopies(5, System.lineSeparator()))

Samuel Harmer 01.03.2017 14:05

С Java 11: System.lineSeparator().repeat(5)

Jacob G. 03.02.2019 18:57

@JacobG Хватит злорадствовать ... некоторые из нас все еще застряли на Java 7.

Andrew T Finnell 07.02.2019 17:02

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

Aubergine 03.02.2020 14:47

Избегайте добавления строк с помощью 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( );

В большинстве случаев это не имеет значения, Джефф Этвуд из Coding Horror сделал сообщение в блоге об этом конкретном виде микрооптимизации.. Всегда делайте метрики, прежде чем делать заявления типа «не делайте string + string».

Spoike 05.12.2012 17:43

Я бы сказал, что статья Джеффа может быть немного неаккуратной, поскольку она касается только времени выполнения. Конкатенация строк в Java связана не только со скоростью выполнения, но и с тем, сколько мусора вы оставляете в памяти для очистки сборщика мусора, что может привести к более частой работе сборщика мусора. Это может быть или не быть проблемой в зависимости от вашей среды и конфигурации.

Lajcik 17.12.2012 18:22

Лайчик, я подозреваю, что это предварительная оптимизация для всех случаев, кроме тех, кто действительно много манипулирует строками. StringBuffer - это анти-шаблон для незначительных требований конкатенации. Во многих случаях я бы предпочел иметь читаемый String1 + разделитель + String2, чем вышеупомянутый многострочный пример. Кроме того, я бы посоветовал проверить, положительно ли влияет на память и сборщик мусора добавление SB. Во многих случаях я предполагаю, что это не так. Если это не стоит тестирования, это, вероятно, предварительная оптимизация, и я бы сосредоточился на удобочитаемости.

Richard Watson 10.01.2013 14:48

Выполнение String1 + String2 аналогично выполнению new StringBuilder (String1) .append (String2) в современных компиляторах, поэтому для конкатенации однострочной строки вообще нет никакой оптимизации. StringBuilder обычно имеет смысл только в циклах или рекурсивных методах. Но в любом случае это может выходить за рамки исходного вопроса.

user327961 15.05.2013 16:48

@ user327961: правдивая история. В этом легко убедиться, используя вашу любимую IDE и отладчик.

Atmocreations 10.10.2013 09:19

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

Или String.format("%n").intern() для экономии байтов.

Это то же самое, что и ответ Алекса Б.

Spoike 29.04.2013 11:49

О, теперь я это вижу. Он написал так много непрошеного материала вокруг своего ответа. ;-)

ceving 29.04.2013 14:07

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

mr5 25.06.2015 09:43

@ mr5 notepad - неподходящий инструмент для просмотра содержимого файла. Используйте hexdump или od.

ceving 25.06.2015 15:18

@ceving Я нахожусь в среде Windows, и я ожидал, что новая строка будет комбинацией \r\n

mr5 26.06.2015 02:58

@ mr5 Чтобы следовать из формы комментариев ceving: вы также можете использовать Notepad ++, Sublime Text или VS code. Все это будет работать, если окончание строки будет '\n' или '\r\n'.

Agi Hammerthief 23.08.2018 10:49

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

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

Другие вопросы по теме