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




Вы можете использовать
System.getProperty("line.separator");
получить разделитель строк
Не забудьте добавить детали Java 7 System.lineSeparator(), чтобы дать окончательный ответ на этот вопрос?
В дополнение к свойству 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»
О боже, «Строка 1» + System.getProperty («line.separator») + «Строка 2» действительно одна из самых уродливых вещей, которые я когда-либо видел. Было бы менее болезненно просто объявить константу в другом месте.
это не работает, по крайней мере, со строкой, входящей в оператор log4j. Создание примера с новой строкой в конце потенциально скрывает проблему. Кроме того, String s2 просто сбивает с толку, используя '%% n'
@StealthRabbi В (по крайней мере) C-подобных языках принято `` экранировать escape-символ '' для вставки буквального символа, например . \\ . (без точек) создает одиночную обратную косую черту, а %% дает одиночный %.
Не используйте это, если ваша строка может содержать % из пользовательского ввода!
@SeanAllred, это правда ... но я думаю, что @StealthRabbi говорил, что в приведенном выше примере (по крайней мере, при первом чтении) неясно, что должен означать %%n. В любом случае форматированный текст должен читать "Use %n as a platform independent newline." с символом новой строки в конце.
@KonstantinWeitz - Почему бы и нет? Подпрограммы форматирования не выполняют двойную обработку форматных замен.
@Ted Hopp, если s - это строка, предоставленная пользователем, вы не должны использовать ее в строке формата, например format(s+"%n"), потому что, если s содержит %, это не удастся. В качестве аргументов формата можно использовать строки, предоставленные пользователем.
@KonstantinWeitz - Что ж, использование строки, предоставленной пользователем, всегда рискованно. Приведенный вами пример завершится ошибкой только в том случае, если строка содержит неэкранированный % в качестве последнего символа. Но в этом случае формат будет недопустимым, если вы используете s+"\n". (Что бы вы предпочли, когда пользователь предоставляет такую строку формата - исключение или отсутствующую новую строку? Я думаю, что это подбрасывание.)
Если вы создаете String и используете разрывы строк для разделения строк, вы хотите проверить, не является ли ваш текст пустым, чтобы у вас не получились просто разрывы строк. В противном случае это хороший совет!
@abahgat Да, но здесь мы говорим о Java, где многословие ценится гораздо выше элегантности или лаконичности.
@KonstantinWeitz, проблема String.format(s + "%n") легко решается String.format("%s%n", s). Всегда рискованно использовать вводимые пользователем данные в качестве тела формата (так же, как eval()).
Если вы пытаетесь записать новую строку в файл, вы можете просто использовать метод новая линия() BufferedWriter.
Если вы пишете в файл, используя экземпляр BufferedWriter, используйте метод newLine() этого экземпляра. Он обеспечивает независимый от платформы способ записи новой строки в файл.
Этот ответ - дубликат Майка Мейерса.
В библиотеке Commons-lang есть поле констант, которое называется SystemUtils.LINE_SEPARATOR.
Да, установите стороннюю библиотеку, чтобы получить независимую от платформы новую строку! #facepalm
@Shervin, конечно, вы бы этого не сделали, но многие проекты, над которыми я работал, уже используют commons-lang и некоторую старую версию Java. Так что, если вы уже используете commons-lang, это разумный ответ. Я не считал нужным указывать на это, я был явно неправ.
Это действительно хорошее предложение для проектов, которые уже используют эту библиотеку, спасибо!
В Java 7 теперь есть метод System.lineSeparator().
Было бы очень хорошо с их стороны предоставить перегруженный метод lineSeperator(int), который возвращает некоторое количество разделителей строк, поскольку я часто использую сразу 2.
@Kon На основе этот ответ: String.join("", Collections.nCopies(5, System.lineSeparator()))
С Java 11: System.lineSeparator().repeat(5)
@JacobG Хватит злорадствовать ... некоторые из нас все еще застряли на Java 7.
@AndrewTFinnell Я бы нашел работу получше <:-P Без контейнеров -> без Java 11, так что вы остаетесь ради лучшей зарплаты, мы можем злорадствовать :-D
Избегайте добавления строк с помощью 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».
Я бы сказал, что статья Джеффа может быть немного неаккуратной, поскольку она касается только времени выполнения. Конкатенация строк в Java связана не только со скоростью выполнения, но и с тем, сколько мусора вы оставляете в памяти для очистки сборщика мусора, что может привести к более частой работе сборщика мусора. Это может быть или не быть проблемой в зависимости от вашей среды и конфигурации.
Лайчик, я подозреваю, что это предварительная оптимизация для всех случаев, кроме тех, кто действительно много манипулирует строками. StringBuffer - это анти-шаблон для незначительных требований конкатенации. Во многих случаях я бы предпочел иметь читаемый String1 + разделитель + String2, чем вышеупомянутый многострочный пример. Кроме того, я бы посоветовал проверить, положительно ли влияет на память и сборщик мусора добавление SB. Во многих случаях я предполагаю, что это не так. Если это не стоит тестирования, это, вероятно, предварительная оптимизация, и я бы сосредоточился на удобочитаемости.
Выполнение String1 + String2 аналогично выполнению new StringBuilder (String1) .append (String2) в современных компиляторах, поэтому для конкатенации однострочной строки вообще нет никакой оптимизации. StringBuilder обычно имеет смысл только в циклах или рекурсивных методах. Но в любом случае это может выходить за рамки исходного вопроса.
@ user327961: правдивая история. В этом легко убедиться, используя вашу любимую IDE и отладчик.
Это также возможно: String.format("%n").
Или String.format("%n").intern() для экономии байтов.
Это то же самое, что и ответ Алекса Б.
О, теперь я это вижу. Он написал так много непрошеного материала вокруг своего ответа. ;-)
Я пробовал сделать это, но когда я просматривал файл в блокноте, он не распознал новую строку.
@ mr5 notepad - неподходящий инструмент для просмотра содержимого файла. Используйте hexdump или od.
@ceving Я нахожусь в среде Windows, и я ожидал, что новая строка будет комбинацией \r\n
@ mr5 Чтобы следовать из формы комментариев ceving: вы также можете использовать Notepad ++, Sublime Text или VS code. Все это будет работать, если окончание строки будет '\n' или '\r\n'.
StringBuilder newLine=new StringBuilder();
newLine.append("abc");
newline.append(System.getProperty("line.separator"));
newline.append("def");
String output=newline.toString();
В приведенном выше фрагменте будут две строки, разделенные новой строкой, независимо от платформ.
Пожалуйста, подумайте об изменении принятых ответов. Второй ответ более уместен.