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

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

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

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

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

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

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

Ответы [ 39 ]

5 голосов
/ 10 июля 2012

Если вы любите гуаву в Google так же сильно, как и я, она может дать довольно четкое представление и хороший и простой способ не жестко закодировать символы новой строки:

String out = Joiner.on(newline).join(ImmutableList.of(
    "line1",
    "line2",
    "line3"));
5 голосов
/ 15 февраля 2014

Используйте Properties.loadFromXML(InputStream). Там нет необходимости для внешних библиотек.

Лучше, чем неаккуратный код (так как ваша забота о поддержке и дизайне), желательно не использовать длинные строки

Начните с чтения свойств xml:

 InputStream fileIS = YourClass.class.getResourceAsStream("MultiLine.xml");
 Properties prop = new Properies();
 prop.loadFromXML(fileIS);


тогда вы можете использовать вашу многострочную строку в более удобном способе ...

static final String UNIQUE_MEANINGFUL_KEY = "Super Duper UNIQUE Key";
prop.getProperty(UNIQUE_MEANINGFUL_KEY) // "\n    MEGA\n   LONG\n..."


MultiLine.xml` располагается в той же папке YourClass:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">

<properties>
    <entry key="Super Duper UNIQUE Key">
       MEGA
       LONG
       MULTILINE
    </entry>
</properties>

PS .: Вы можете использовать <![CDATA[" ... "]]> для xml-подобной строки.

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

Довольно эффективное и независимое от платформы решение будет использовать системное свойство для разделителей строк и класс StringBuilder для построения строк:

String separator = System.getProperty("line.separator");
String[] lines = {"Line 1", "Line 2" /*, ... */};

StringBuilder builder = new StringBuilder(lines[0]);
for (int i = 1; i < lines.length(); i++) {
    builder.append(separator).append(lines[i]);
}
String multiLine = builder.toString();
3 голосов
/ 18 мая 2009

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

Многострочные строки не разрешены в файлах свойств. Вы можете использовать \ n в файлах свойств, но я не думаю, что это большая часть решения в вашем случае.

3 голосов
/ 21 сентября 2018

С JDK / 12 раннего доступа build # 12 , теперь можно использовать многострочные строки в Java следующим образом:

String multiLine = `First line
    Second line with indentation
Third line
and so on...`; // the formatting as desired
System.out.println(multiLine);

и это приводит к следующему выводу:

First line
    Second line with indentation
Third line
and so on...
3 голосов
/ 17 мая 2010

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

  1. Создайте утилиту 'textfile to java code' и войдите в систему контроля версий
  2. В каждой сборке запускайте утилиту для файла ресурсов, чтобы создать исправленный источник Java
  3. Исходный код Java содержит заголовок, подобный class TextBlock {..., за которым следует статическая строка, которая автоматически генерируется из файла ресурсов
  4. Создайте сгенерированный Java-файл с остальным кодом
3 голосов
/ 08 июля 2018

Я знаю, что это старый вопрос, однако для заинтересованных разработчиков Многолинейные литералы будут в # Java12

http://mail.openjdk.java.net/pipermail/amber-dev/2018-July/003254.html

3 голосов
/ 18 мая 2016

Один хороший вариант.

import static some.Util.*;

    public class Java {

        public static void main(String[] args) {

            String sql = $(
              "Select * from java",
              "join some on ",
              "group by"        
            );

            System.out.println(sql);
        }

    }


    public class Util {

        public static String $(String ...sql){
            return String.join(System.getProperty("line.separator"),sql);
        }

    }
2 голосов
/ 12 декабря 2010

Один маленький трюк. Используя это, я внедряю javascritp в динамически созданную HTML-страницу

StringBuilder builder = new StringBuilder();

public String getString()
{
    return builder.toString();
}
private DropdownContent _(String a)
{
    builder.append(a);
    return this;
}

public String funct_showhide()
{
   return
    _("function slidedown_showHide(boxId)").
    _("{").
    _("if(!slidedown_direction[boxId])slidedown_direction[boxId] = 1;").
    _("if(!slideDownInitHeight[boxId])slideDownInitHeight[boxId] = 0;").
    _("if(slideDownInitHeight[boxId]==0)slidedown_direction[boxId]=slidedownSpeed; ").
    _("else slidedown_direction[boxId] = slidedownSpeed*-1;").
    _("slidedownContentBox = document.getElementById(boxId);").
    _("var subDivs = slidedownContentBox.getElementsByTagName('DIV');").
    _("for(var no=0;no<subDivs.length;no++){").
    _(" if(subDivs[no].className=='dhtmlgoodies_content')slidedownContent = subDivs[no];").
    _("}").
    _("contentHeight = slidedownContent.offsetHeight;").
    _("slidedownContentBox.style.visibility='visible';").
    _("slidedownActive = true;").
    _("slidedown_showHide_start(slidedownContentBox,slidedownContent);").
    _("}").getString();

}
2 голосов
/ 19 мая 2009

Когда используется длинная серия +, создается только один StringBuilder, если только String не определен во время компиляции, и в этом случае StringBuilder не используется!

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

String a = "a\n";
String b = "b\n";
String c = "c\n";
String d = "d\n";

String abcd = a + b + c + d;
System.out.println(abcd);

String abcd2 = "a\n" +
        "b\n" +
        "c\n" +
        "d\n";
System.out.println(abcd2);

Примечание. Создан только один StringBuilder.

  Code:
   0:   ldc     #2; //String a\n
   2:   astore_1
   3:   ldc     #3; //String b\n
   5:   astore_2
   6:   ldc     #4; //String c\n
   8:   astore_3
   9:   ldc     #5; //String d\n
   11:  astore  4
   13:  new     #6; //class java/lang/StringBuilder
   16:  dup
   17:  invokespecial   #7; //Method java/lang/StringBuilder."<init>":()V
   20:  aload_1
   21:  invokevirtual   #8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   24:  aload_2
   25:  invokevirtual   #8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   28:  aload_3
   29:  invokevirtual   #8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   32:  aload   4
   34:  invokevirtual   #8; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   37:  invokevirtual   #9; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   40:  astore  5
   42:  getstatic       #10; //Field java/lang/System.out:Ljava/io/PrintStream;
   45:  aload   5
   47:  invokevirtual   #11; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   50:  ldc     #12; //String a\nb\nc\nd\n
   52:  astore  6
   54:  getstatic       #10; //Field java/lang/System.out:Ljava/io/PrintStream;
   57:  aload   6
   59:  invokevirtual   #11; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   62:  return

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

Сделайте это как можно более понятным и простым.

...