Многострочная строка Java - PullRequest
467 голосов
/ 18 мая 2009

Исходя из Perl, я уверен, что мне не хватает средства "здесь-документ" для создания многострочной строки в исходном коде:

$string = <<"EOF"  # create a three-line string
text
text
text
EOF

В Java мне нужно иметь громоздкие кавычки и знаки плюс в каждой строке, когда я объединяю свою многострочную строку с нуля.

Какие есть лучшие альтернативы? Определить мою строку в файле свойств?

Редактировать : в двух ответах говорится, что StringBuilder.append () предпочтительнее плюсовой нотации. Может ли кто-нибудь уточнить, почему они так думают? Это не выглядит более предпочтительным для меня вообще. Я ищу способ обойти тот факт, что многострочные строки не являются языковой конструкцией первого класса, а это означает, что я определенно не хочу заменять языковую конструкцию первого класса (конкатенация строк с плюсом) вызовами методов. *

Редактировать : Чтобы прояснить мой вопрос, я совсем не беспокоюсь о производительности. Я обеспокоен ремонтопригодностью и проблемами проектирования.

Ответы [ 39 ]

10 голосов
/ 18 мая 2009

К сожалению, в Java нет многострочных строковых литералов. Вы должны либо объединить строковые литералы (используя + или StringBuilder как два наиболее распространенных подхода к этому), либо прочитать строку из отдельного файла.

Для больших многострочных строковых литералов я склонен использовать отдельный файл и читать его с использованием getResourceAsStream() (метод класса Class). Это облегчает поиск файла, так как вам не нужно беспокоиться о текущем каталоге по сравнению с тем, где был установлен ваш код. Это также упрощает упаковку, потому что вы можете хранить файл в вашем jar-файле.

Предположим, вы в классе Foo. Просто сделайте что-то вроде этого:

Reader r = new InputStreamReader(Foo.class.getResourceAsStream("filename"), "UTF-8");
String s = Utils.readAll(r);

Еще одно неудобство заключается в том, что в Java нет стандартного метода «читать весь текст из этого Reader в строку». Это довольно легко написать, хотя:

public static String readAll(Reader input) {
    StringBuilder sb = new StringBuilder();
    char[] buffer = new char[4096];
    int charsRead;
    while ((charsRead = input.read(buffer)) >= 0) {
        sb.append(buffer, 0, charsRead);
    }
    input.close();
    return sb.toString();
}
10 голосов
/ 18 мая 2009
String newline = System.getProperty ("line.separator");
string1 + newline + string2 + newline + string3

Но лучшая альтернатива - использовать String.format

String multilineString = String.format("%s\n%s\n%s\n",line1,line2,line3);
9 голосов
/ 03 мая 2018

JEP 326: Литералы необработанных строк будут реализовывать многострочные строки, поэтому вы сможете написать что-то вроде:

String s = `
    text
    text
    text
  `;
9 голосов
/ 18 мая 2010

Вы можете использовать scala-код, который совместим с java и допускает многострочные строки, заключенные в "" ":

package foobar
object SWrap {
  def bar = """John said: "This is
  a test
  a bloody test,
  my dear." and closed the door.""" 
}

(обратите внимание на кавычки внутри строки) и из Java:

String s2 = foobar.SWrap.bar ();

Это удобнее ...?

Другим подходом, если вы часто обрабатываете длинный текст, который должен быть помещен в ваш исходный код, может быть сценарий, который берет текст из внешнего файла и упаковывает его в многострочную строку-java, например: *

sed '1s/^/String s = \"/;2,$s/^/\t+ "/;2,$s/$/"/' file > file.java

, чтобы вы могли легко вырезать и вставлять его в свой источник.

9 голосов
/ 21 февраля 2011

Поскольку Java (пока) не поддерживает нативные многострочные строки, на данный момент единственный способ это обойти, используя один из вышеупомянутых методов. Я построил следующий скрипт на Python, используя некоторые из трюков, упомянутых выше:

import sys
import string
import os

print 'new String('
for line in sys.stdin:
    one = string.replace(line, '"', '\\"').rstrip(os.linesep)
    print '  + "' + one + ' "'
print ')'

Поместите это в файл с именем javastringify.py и свою строку в файл mystring.txt и запустите его следующим образом:

cat mystring.txt | python javastringify.py

Затем вы можете скопировать вывод и вставить его в свой редактор.

Измените это по мере необходимости для обработки любых особых случаев, но это работает для моих нужд. Надеюсь, это поможет!

8 голосов
/ 18 мая 2009

Вы можете объединить свои добавления отдельным методом, например:

public static String multilineString(String... lines){
   StringBuilder sb = new StringBuilder();
   for(String s : lines){
     sb.append(s);
     sb.append ('\n');
   }
   return sb.toString();
}

В любом случае, предпочитайте StringBuilder плюсовой записи.

7 голосов
/ 14 июля 2014

На самом деле, это самая чистая реализация, которую я видел до сих пор. Он использует аннотацию для преобразования комментария в строковую переменную ...

/**
  <html>
    <head/>
    <body>
      <p>
        Hello<br/>
        Multiline<br/>
        World<br/>
      </p>
    </body>
  </html>
  */
  @Multiline
  private static String html;

Итак, конечный результат состоит в том, что переменная html содержит многострочную строку. Без кавычек, без плюсов, без запятых, только чистая строка.

Это решение доступно по следующему URL ... http://www.adrianwalker.org/2011/12/java-multiline-string.html

Надеюсь, это поможет!

7 голосов
/ 14 января 2012

См. Java Stringfier . Превращает ваш текст в Java-блок StringBuilder, экранирующий при необходимости.

6 голосов
/ 03 июня 2014
    import org.apache.commons.lang3.StringUtils;

    String multiline = StringUtils.join(new String[] {
        "It was the best of times, it was the worst of times ", 
        "it was the age of wisdom, it was the age of foolishness",
        "it was the epoch of belief, it was the epoch of incredulity",
        "it was the season of Light, it was the season of Darkness",
        "it was the spring of hope, it was the winter of despair",
        "we had everything before us, we had nothing before us"
    }, "\n");
6 голосов
/ 03 ноября 2009

Альтернативой, которую я пока не видел в качестве ответа, является java.io.PrintWriter.

StringWriter stringWriter = new StringWriter();
PrintWriter writer = new PrintWriter(stringWriter);
writer.println("It was the best of times, it was the worst of times");
writer.println("it was the age of wisdom, it was the age of foolishness,");
writer.println("it was the epoch of belief, it was the epoch of incredulity,");
writer.println("it was the season of Light, it was the season of Darkness,");
writer.println("it was the spring of hope, it was the winter of despair,");
writer.println("we had everything before us, we had nothing before us");
String string = stringWriter.toString();

Также не упоминается тот факт, что java.io.BufferedWriter имеет метод newLine().

...