Исходя из Perl, я уверен, что мне не хватает средства «здесь-документ» для создания многострочной строки в исходном коде:
$string = <<"EOF" # create a three-line string
text
text
text
EOF
В Java у меня должны быть громоздкие кавычки и знаки плюс в каждой строке, поскольку я объединяю свою многострочную строку с нуля.
Какие есть лучшие альтернативы? Определить мою строку в файле свойств?
Изменить : два ответа говорят, что StringBuilder.append () предпочтительнее, чем нотации плюс. Кто-нибудь может уточнить, почему они так думают? Это не выглядит более предпочтительным для меня вообще. Я ищу способ обойти тот факт, что многострочные строки не являются языковой конструкцией первого класса, а это значит, что я определенно не хочу заменять языковую конструкцию первого класса (конкатенация строк с плюсом) вызовами методов.
Изменить : Чтобы уточнить мой вопрос дальше, я не беспокоюсь о производительности вообще. Я обеспокоен вопросами ремонтопригодности и дизайна.
string1 + string2
это, вы выделяете новый строковый объект и копируете символы из обеих входных строк. Если вы добавляете n строк вместе, вы будете делать n-1 выделения и примерно (n ^ 2) / 2 символа копий. StringBuilder, с другой стороны, копирует и перераспределяет реже (хотя он все равно делает оба, когда вы превышаете размер его внутреннего буфера). Теоретически, бывают случаи, когда компилятор может конвертировать + в StringBuilder, но на практике кто знает.Ответы:
Стивен Колебурн создал предложение о добавлении многострочных строк в Java 7.
Кроме того, в Groovy уже есть поддержка многострочных строк .
источник
Звучит так, как будто вы хотите создать многострочный литерал, которого нет в Java.
Ваша лучшая альтернатива - это струны, которые просто были
+
вместе. Некоторые другие опции, о которых упоминали люди (StringBuilder, String.format, String.join), будут предпочтительнее, только если вы начинаете с массива строк.Учти это:
По сравнению с
StringBuilder
:По сравнению с
String.format()
:По сравнению с Java8
String.join()
:Если вы хотите новую строку для вашей конкретной системы, вы должны либо использовать
System.lineSeparator()
, или вы можете использовать%n
вString.format
.Другой вариант - поместить ресурс в текстовый файл и просто прочитать содержимое этого файла. Это было бы предпочтительным для очень больших строк, чтобы избежать ненужного раздувания ваших файлов классов.
источник
String.format
версией заключается в том, что вы должны синхронизировать формат с количеством строк.В Eclipse, если вы включите опцию «Избегать текста при вставке в строковый литерал» (в «Предпочтения»> «Java»> «Редактор»> «Ввод») и вставите многострочную строку в кавычки, она автоматически добавится
"
и\n" +
для всех ваших строк.источник
\r
что Eclipse вставляет в Windows?Это старый поток, но новое довольно элегантное решение (с 4 или 3 небольшими недостатками) заключается в использовании пользовательской аннотации.
Проверьте : http://www.adrianwalker.org/2011/12/java-multiline-string.html
Проект, вдохновленный этой работой, размещен на GitHub:
https://github.com/benelog/multiline
Пример кода Java:
Недостатки
<%= variable %>
) :-)И вам, вероятно, придется настроить Eclipse / Intellij-Idea, чтобы не переформатировать автоматически ваши комментарии Javadoc.
Это может показаться странным (комментарии Javadoc не предназначены для встраивания чего-либо, кроме комментариев), но поскольку отсутствие многострочной строки в Java действительно раздражает в конце, я считаю, что это наименее худшее решение.
источник
Другим вариантом может быть сохранение длинных строк во внешнем файле и чтение файла в строку.
источник
@
Синтаксис C # гораздо чище.Это то, что вы никогда не должны использовать, не задумываясь о том, что он делает. Но для одноразовых сценариев я использовал это с большим успехом:
Пример:
Код:
источник
String.join
Java 8 добавил новый статический метод,
java.lang.String
который предлагает немного лучшую альтернативу:String.join( CharSequence delimiter , CharSequence... elements )
Используй это:
источник
"\n"
не требуется, и он знает о портативности!JEP 355. Текстовые блоки (предварительный просмотр) предназначены для охвата этой функциональности, в настоящее время он нацелен на JDK 13 в качестве функции предварительного просмотра. Позволяет написать что-то вроде:
До этого JEP, в JDK12, JEP 326: сырые строковые литералы стремились реализовать подобную функцию, но она была окончательно отозвана.
источник
Если вы определите свои строки в файле свойств, это будет выглядеть намного хуже. IIRC, это будет выглядеть так:
Обычно разумно не вставлять большие строки в источник. Возможно, вы захотите загрузить их как ресурсы, возможно, в формате XML или в читаемом текстовом формате. Текстовые файлы могут быть прочитаны во время выполнения или скомпилированы в исходный код Java. Если вы в конечном итоге поместите их в исходный код, я предлагаю поместить его
+
в начало и пропустить ненужные новые строки:Если у вас есть новые строки, вы можете захотеть использовать метод объединения или форматирования:
источник
Плюсы преобразуются в StringBuilder.append, за исключением случаев, когда обе строки являются константами, поэтому компилятор может объединять их во время компиляции. По крайней мере, так оно и есть в компиляторе Sun, и я подозреваю, что большинство, если не все другие компиляторы будут делать то же самое.
Так:
обычно генерирует точно такой же код как:
С другой стороны:
такой же как:
Таким образом, штраф за разбивку строковых литералов по нескольким строкам со знаком плюс для удобства чтения отсутствует.
источник
В IntelliJ IDE вам просто нужно набрать:
Затем поместите курсор в кавычки и вставьте строку. Среда IDE развернет ее на несколько объединенных строк.
источник
К сожалению, в Java нет многострочных строковых литералов. Вы должны либо объединить строковые литералы (используя + или StringBuilder как два наиболее распространенных подхода к этому), либо прочитать строку из отдельного файла.
Для больших многострочных строковых литералов я был бы склонен использовать отдельный файл и читать его при использовании
getResourceAsStream()
(методClass
класса). Это облегчает поиск файла, так как вам не нужно беспокоиться о текущем каталоге по сравнению с тем, где был установлен ваш код. Это также упрощает упаковку, потому что вы можете хранить файл в вашем jar-файле.Предположим, вы в классе Foo. Просто сделайте что-то вроде этого:
Еще одно неудобство заключается в том, что в Java нет стандартного метода «читать весь текст из этого Reader в String». Это довольно легко написать, хотя:
источник
Но лучшая альтернатива - использовать String.format
источник
Поскольку Java (пока) не поддерживает нативные многострочные строки, на данный момент единственный способ это обойти, используя один из вышеупомянутых методов. Я построил следующий скрипт на Python, используя некоторые приемы, упомянутые выше:
Поместите это в файл с именем javastringify.py и свою строку в файл mystring.txt и запустите его следующим образом:
Затем вы можете скопировать вывод и вставить его в свой редактор.
Измените это по мере необходимости для обработки любых особых случаев, но это работает для моих нужд. Надеюсь это поможет!
источник
Вы можете использовать scala-код, который совместим с java и допускает многострочные строки, заключенные в "" ":
(обратите внимание на кавычки внутри строки) и из Java:
Это удобнее ...?
Другой подход, если вы часто обрабатываете длинный текст, который должен быть помещен в ваш исходный код, может быть сценарием, который берет текст из внешнего файла и упаковывает его в многострочную-java-String, например так:
так что вы можете легко вырезать и вставлять его в свой источник.
источник
Вы можете объединить свои добавления отдельным методом, например:
В любом случае, предпочитайте
StringBuilder
плюс.источник
На самом деле, следующее является самой чистой реализацией, которую я видел до сих пор. Он использует аннотацию для преобразования комментария в строковую переменную ...
Таким образом, конечным результатом является то, что переменная html содержит многострочную строку. Без кавычек, без плюсов, без запятых, просто чистая строка.
Это решение доступно по следующему URL ... http://www.adrianwalker.org/2011/12/java-multiline-string.html
Надеюсь, это поможет!
источник
Смотрите Java Stringfier . Превращает ваш текст в Java-блок StringBuilder, экранирующий при необходимости.
источник
источник
Альтернативой, которую я пока не видел в качестве ответа, является
java.io.PrintWriter
.Также факт, что
java.io.BufferedWriter
естьnewLine()
метод, не упомянут.источник
Если вам нравится гуава в Google, как и я, он может дать довольно чистое представление и хороший и простой способ не жестко кодировать символы новой строки:
источник
Использование
Properties.loadFromXML(InputStream)
. Там нет необходимости для внешних библиотек.Лучше, чем неаккуратный код (так как ваша забота о поддержке и дизайне), желательно не использовать длинные строки.
Начните с чтения свойств xml:
тогда вы можете использовать вашу многострочную строку более удобным способом ...
MultiLine.xml` располагается в той же папке YourClass:
PS: Вы можете использовать
<![CDATA["
..."]]>
для xml-подобной строки.источник
С JDK / 12 раннего доступа build # 12 , теперь можно использовать многострочные строки в Java следующим образом:
и это приводит к следующему выводу:
Редактировать: Отложено на Java 13
источник
Довольно эффективное и независимое от платформы решение будет использовать системное свойство для разделителей строк и класс StringBuilder для построения строк:
источник
Один хороший вариант.
источник
Java 13 и выше
Многострочные строки теперь поддерживаются в Java с помощью текстовых блоков . В Java 13 и 14 эта функция требует, чтобы вы установили
––enable–preview
опцию при сборке и запуске вашего проекта. Проверьте эту документацию Java для более подробной информации.Теперь, до Java 13, вот как бы вы написали запрос:
Благодаря Java 13 Text Blocks вы можете переписать этот запрос следующим образом:
Гораздо более читабельно, верно?
Поддержка IDE
IntelliJ IDEA поддерживает преобразование устаревших
String
блоков сцепления в новый многострочныйString
формат:JSON, HTML, XML
Многострочный
String
особенно полезен при написании JSON, HTML или XML.Рассмотрим этот пример с использованием
String
конкатенации для построения строкового литерала JSON:Вы едва можете прочитать JSON из-за экранирующих символов и обилия двойных кавычек и знаков плюс.
С помощью текстовых блоков Java объект JSON можно записать так:
С тех пор, как я использовал C # в 2004 году, я хотел иметь эту функцию на Java, и теперь мы наконец-то ее получили.
источник
Многострочные строки не допускаются в файлах свойств. Вы можете использовать \ n в файлах свойств, но я не думаю, что это большая часть решения в вашем случае.
источник
Я знаю, что это старый вопрос, однако для заинтересованных разработчиков Многострочные литералы будут в # Java12
http://mail.openjdk.java.net/pipermail/amber-dev/2018-July/003254.html
источник
Я предлагаю использовать утилиту, предложенную ThomasP, а затем связать ее с процессом сборки. Внешний файл все еще присутствует, чтобы содержать текст, но файл не читается во время выполнения. Рабочий процесс тогда:
class TextBlock {...
статической строке, которая автоматически генерируется из файла ресурсов.источник
Когда используется длинная серия +, создается только один StringBuilder, если только String не определен во время компиляции, и в этом случае StringBuilder не используется!
Единственный раз, когда StringBuilder более эффективен, это когда несколько операторов используются для создания String.
Примечание. Создан только один StringBuilder.
Сделайте это как можно более понятным и простым.
источник