Java 中怎么使用多行字符串和文本块?

本文将向您展示几种在Java中声明和使用多行字符串的方法。

  1. String + String + String
  2. StringBuilder
  3. String.format
  4. StringWriter
  5. String.join (Java 8)
  6. Files.lines (Java 8)
  7. (""") Java 13和Java 14文本块(预览功能)

查看HTML和JSON字符串,我们将使用上述方法在Java中声明以下多行字符串。


    
        

Hello, World

{ "name":"mkyong", "age":38 }

1.字符串+字符串+字符串

最简单的解决方案是使用+添加多行字符串。

MultiLineString1.java
String html = "\n"
                + "     \n"
                + "         

Hello, World

\n" + " \n" + ""; String json = "{\n" + " \"name\":\"mkyong\",\n" + " \"age\":38\n" + "}";
 

2.字符串生成器

此方法是常用的模式。

MultiLineString2.java
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();

3.字符串格式

它可以工作,但不建议这样做,很难计算%s的数量。

MultiLineString3.java
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" , "}");

4.字符串作家

有点奇怪,但它可以工作。

MultiLineString4.java
// 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();

5. Java 8 String.join

Java 8用多行连接多行字符串。

MultiLineString5.java
String html = String.join("\n"
                , ""
                , "     "
                , "         

Hello, World

" , " " , ""); String json = String.join("\n" , "{" , " \"name\":\"mkyong\"," , " \"age\":38" , "}");

6. Files.lines

通常将多行字符串放入文件中。 本示例使用Files.lines从类路径资源文件夹中加载文件,并将其转换为Stream进行处理。

resources/test.html

    
        

Hello, World

MultiLineString6.java
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")));

    }
}

输出量

Terminal

    
        

Hello, World

7.文本块(Java 13,14中的预览)

7.1现在,我们可以使用三个双引号字符(""")在Java中声明多行字符串。此文本块是推荐的解决方案,简洁美观,希望它将很快成为标准功能。

PS text blocks是Java 13和Java 14中的预览功能,在将来的发行版中可能会再次更改。

TextBlockExample.java
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\t

Hello, 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::replaceString.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

\ """;

输出量

Terminal

            

Hello, ' ' World

7.7 Java 15(尚未发布),待续。

下载源代码

$ git clone https://github.com/mkyong/core-java

$ cd java-13
$ cd java-14

参考文献

  • Java从资源文件夹读取文件
  • Java 13的新增功能
  • Java 14的新增功能
  • JEP 355:文本块(预览)
  • JEP 368:文本块(第二预览)
  • Java 8 – StringJoiner示例

翻译自: https://mkyong.com/java/java-multi-line-string-text-blocks/

你可能感兴趣的:(字符串,java,大数据,python,json)