来自Perl,我肯定错过了在源代码中创建多行字符串的“here-document”方法:

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

在Java中,当我从头开始连接多行字符串时,我必须在每一行上使用繁琐的引号和加号。

有什么更好的选择吗?在属性文件中定义我的字符串?

编辑:有两个答案说StringBuilder.append()比加号更可取。谁能详细解释一下他们为什么这么想?在我看来,这一点也不可取。我正在寻找一种方法来解决多行字符串不是一级语言结构这一事实,这意味着我绝对不想用方法调用取代一级语言结构(字符串连接与加号)。

编辑:为了进一步澄清我的问题,我根本不关心性能。我关心的是可维护性和设计问题。


当前回答

使用JDK/12早期访问构建# 12,现在可以在Java中使用多行字符串,如下所示:

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

这将导致以下输出:

第一行 第二行有缩进 第三行 等等……

编辑: 推迟至java 13

其他回答

一个简单的选择是使用SciTE (http://www.scintilla.org/SciTEDownload.html)这样的编辑器编辑java代码,它允许您对文本进行WRAP,以便容易地查看和编辑长字符串。如果你需要转义字符,你只需输入它们。通过关闭“换行”选项,您可以检查字符串是否仍然是一个很长的单行字符串。当然,如果不是,编译器也会告诉你。

Eclipse或NetBeans是否支持编辑器中的文本包装,我不知道,因为它们有太多的选项。但如果没有,这将是一个很好的补充。

在属性文件中定义我的字符串?

属性文件中不允许多行字符串。您可以在属性文件中使用\n,但我认为这在您的情况下不是一个很好的解决方案。

String.join

Java 8为Java .lang. string添加了一个新的静态方法,它提供了一个更好的选择:

String.join ( CharSequence分隔符, CharSequence进行…元素 )

使用它:

String s = String.join(
    System.getProperty("line.separator"),
    "First line.",
    "Second line.",
    "The rest.",
    "And the last!"
);

参见Java Stringfier。如果需要,将文本转换为StringBuilder java块转义。

一个非常高效且与平台无关的解决方案是使用系统属性的行分隔符和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();