本文将向您展示几种在Java中声明和使用多行字符串的方法。
String + String + String
StringBuilder
String.format
StringWriter
String.join
(Java 8)Files.lines
(Java 8)(""")
Java 13和Java 14文本块(预览功能)查看HTML和JSON字符串,我们将使用上述方法在Java中声明以下多行字符串。
Hello, World
{
"name":"mkyong",
"age":38
}
最简单的解决方案是使用+
添加多行字符串。
String html = "\n"
+ " \n"
+ " Hello, World
\n"
+ " \n"
+ "";
String json = "{\n"
+ " \"name\":\"mkyong\",\n"
+ " \"age\":38\n"
+ "}";
此方法是常用的模式。
String html = new StringBuilder()
.append("\n")
.append(" \n")
.append(" Hello, World
\n")
.append(" \n")
.append("")
.toString();
String json = new StringBuilder()
.append("{\n")
.append(" \"name\":\"mkyong\",\n")
.append(" \"age\":38\n")
.append("}").toString();
它可以工作,但不建议这样做,很难计算%s
的数量。
String html = String.format("%s\n%s\n%s\n%s\n%s"
, ""
, " "
, " Hello, World
"
, " "
, "");
String json = String.format("%s\n%s\n%s\n%s"
, "{"
, " \"name\":\"mkyong\","
, " \"age\":38"
, "}");
有点奇怪,但它可以工作。
// no need close this
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
pw.println("");
pw.println(" ");
pw.println(" Hello, World
");
pw.println(" ");
pw.println("");
String html = sw.toString();
StringWriter sw2 = new StringWriter();
PrintWriter pw2 = new PrintWriter(sw2);
pw2.println("{");
pw2.println(" \"name\":\"mkyong\",");
pw2.println(" \"age\":38");
pw2.println("}");
String json = sw2.toString();
String.join
Java 8用多行连接多行字符串。
String html = String.join("\n"
, ""
, " "
, " Hello, World
"
, " "
, "");
String json = String.join("\n"
, "{"
, " \"name\":\"mkyong\","
, " \"age\":38"
, "}");
通常将多行字符串放入文件中。 本示例使用Files.lines
从类路径资源文件夹中加载文件,并将其转换为Stream
进行处理。
Hello, World
package com.mkyong.java13.jep355;
import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class MultiLineString6 {
public static void main(String[] args) throws IOException, URISyntaxException {
Stream lines = Files.lines(
Paths.get(ClassLoader.getSystemResource("test.html").toURI())
);
System.out.println(lines.collect(Collectors.joining("\n")));
}
}
输出量
Hello, World
7.1现在,我们可以使用三个双引号字符(""")
在Java中声明多行字符串。此文本块是推荐的解决方案,简洁美观,希望它将很快成为标准功能。
PS text blocks
是Java 13和Java 14中的预览功能,在将来的发行版中可能会再次更改。
String html = """
Hello, World
""";
String json = """
{
"name":"mkyong",
"age":38
}
""";
该文本阻止:
"""
line 1
line 2
line 3
"""
等效于此:
"line 1\nline 2\nline 3\n"
7.2该文本块支持转义序列。
String html = """
\t
\t\tHello, World
\t
""";
7.3引号(")
可以在文本块内使用;请参阅此多行JSON格式的字符串。
String json = """
{
"name":"mkyong",
"age":38
}
""";
7.4文本块的连接,下面是有效的语法。
String html = "\n" +
"""
Hello, World
"""+
"";
7.5在Java 13中,添加了三种方法来支持文本块。
String::stripIndent()
:从文本块内容中去除附带的空白。String::translateEscapes()
:转换转义序列。String::formatted(Object... args)
:用于文本块中的值替换。文本块中值替换的String::formatted
示例。
String json = """
{
"name":"%s",
"age":%d,
"address":"%s"
}
""";
System.out.println(json.formatted("mkyong", 38, "abc"));
我们可以使用标准的String::replace
或String.format
这样获得相同的结果:
// String.format
String json = """
{
"name":"%s",
"age":%d,
"address":"%s"
}
""";
System.out.println(String.format(json, "mkyong", 38, "abc"));
// String::replace
String json2 = """
{
"name":"$name",
"age":$age,
"address":"$address"
}
""";
System.out.println(json2
.replace("$name", "mkyong")
.replace("$age", "38")
.replace("$address", "abc"));
我们是否需要一个新的API String::formatted(Object... args)
进行值替换?
7.6在Java 14中,添加了两个方法来支持文本块。
\
禁止行终止。\s
被翻译成一个空格。String html = """
\
Hello, '\s' World
\
""";
输出量
Hello, ' ' World
7.7 Java 15(尚未发布),待续。
$ git clone https://github.com/mkyong/core-java
$ cd java-13
$ cd java-14
翻译自: https://mkyong.com/java/java-multi-line-string-text-blocks/