Java使用文本块(Text Blocks)处理多行字符串的操作方法

 更新时间:2026年05月21日 08:50:56   作者:希望永不加班  
本文介绍了Java文本块(TextBlocks)语法,它简化多行字符串的处理,保留文本格式、减少错误、提升代码可读性,本文详细解释了文本块的语法、缩进规则、常用转义符及常见使用场景,同时注意事项,需要的朋友可以参考下

在Java开发中,多行字符串的处理曾是每个开发者的“日常痛点”。无论是编写复杂的SQL查询语句、格式化的JSON字符串、HTML邮件模板,还是多行日志、接口说明,传统方式都需要手动拼接字符串、添加换行符、转义特殊字符,不仅代码冗长杂乱,还极易出现语法错误,后期维护更是举步维艰。

为彻底解决这一问题,Java官方推出了「文本块(Text Blocks)」语法,它无需手动拼接、无需额外换行符,仅用简单的标记就能实现多行字符串的优雅编写,大幅提升开发效率和代码可读性。

一、什么是文本块?

文本块(Text Blocks)是Java用于处理多行字符串的专用语法,本质上是普通字符串(java.lang.String)的简化写法,并非全新的数据类型。它通过「三个双引号(""")」作为起始和结束标记,包裹多行文本内容,自动保留文本的换行、空格格式,无需手动添加换行符(n)、无需用+拼接字符串,也无需频繁转义双引号等特殊字符。

核心优势:

  • 简洁高效:无需手动拼接、无需换行符,直接按真实格式编写多行文本;
  • 可读性强:保留文本原始格式,SQL、JSON、HTML等代码片段一目了然;
  • 减少错误:避免拼接遗漏、转义错误、换行符缺失等常见问题;
  • 无缝兼容:与普通字符串完全等价,可直接使用所有String类的API(如length()、replace()、substring()等)。

二、基础语法与硬性规则

文本块的语法看似简单,但有几个硬性规则必须严格遵守,否则会直接编译报错,这也是新手最容易踩坑的地方。

2.1 基础语法格式

文本块的核心语法只有一个:用三个双引号(""")包裹多行文本,具体格式要求如下:

// 标准格式(推荐)
String 文本块变量名 = """
        第一行文本内容
        第二行文本内容
        第三行文本内容
        """;

拆解说明:

1. 起始标记:三个双引号("""),必须单独一行,不能与任何文本内容在同一行(这是硬性要求,违反会编译报错);

2. 文本内容:紧跟起始标记,每行文本可自由编写,换行无需手动添加n,文本中的空格、缩进会被自动保留;

3. 结束标记:三个双引号("""),可与最后一行文本在同一行,也可单独一行(推荐单独一行,与起始标记对齐,保证格式整洁);

4. 缩进要求:文本内容的缩进以「结束标记的缩进位置」为准,结束标记缩进多少,文本内容左侧的多余缩进就会自动去除多少(重点,后面单独详解)。

2.2 正确与错误示例对比

// 正确示例1:结束标记单独一行(推荐)
String json = """
        {
          "id": 1001,
          "username": "zhangsan",
          "age": 28
        }""";
// 正确示例2:结束标记与最后一行文本同一行
String html = """
        <h1>Java文本块</h1>
        <p>优雅处理多行字符串</p>""";
// 错误示例1:起始标记与文本内容同一行(编译报错)
String error1 = """Hello World"""; // 报错:非法表达式开始
// 错误示例2:起始标记后无换行(编译报错)
String error2 = """ 第一行文本
        第二行文本"""; // 报错:文本块起始标记后必须换行
// 错误示例3:结束标记缺失(编译报错)
String error3 = """
        第一行文本
        第二行文本; // 报错:未闭合的字符串字面量""";

2.3 文本块与普通字符串的等价性

重要提醒:文本块本质上就是普通字符串,与用单个双引号(")包裹的字符串完全等价,可无缝衔接所有String API,运行时性能也完全一致。

// 文本块
String textBlock = """
        Hello World
        Java Text Blocks""";
// 普通字符串(等价于上面的文本块)
String normalStr = "Hello World\nJava Text Blocks";
// 两者完全等价
System.out.println(textBlock.equals(normalStr)); // true
System.out.println(textBlock.length() == normalStr.length()); // true
// 无缝使用String API
String upperStr = textBlock.toUpperCase(); // 转为大写
String subStr = textBlock.substring(0, 5); // 截取子串
boolean contains = textBlock.contains("Java"); // 判断包含关系

三、缩进规则

文本块的缩进处理是最容易出错的地方,很多开发者编写的文本块格式混乱,本质上都是没掌握缩进规则。核心原则:文本块最终的缩进 = 编写时的缩进 - 结束标记的缩进

3.1 缩进规则详解

Java编译器在处理文本块时,会自动“去除多余缩进”,去除的缩进量由「结束标记的缩进位置」决定,具体分为3种情况:

1. 结束标记与起始标记缩进一致(推荐):文本内容会去除与起始/结束标记相同的缩进量,保留文本内部的相对缩进;

2. 结束标记缩进比起始标记少:文本内容会去除与结束标记相同的缩进量,剩余的缩进会被保留;

3. 结束标记无缩进:文本内容会保留编写时的全部缩进,容易导致格式混乱(不推荐)。

3.2 示例

// 示例1:结束标记与起始标记缩进一致(推荐)
// 起始标记缩进4个空格,结束标记也缩进4个空格
String str1 = """
    第一行文本(无缩进)
      第二行文本(缩进2个空格)
    第三行文本(无缩进)
    """;
// 最终输出(去除4个空格,保留内部相对缩进):
// 第一行文本(无缩进)
//   第二行文本(缩进2个空格)
// 第三行文本(无缩进)
// 示例2:结束标记缩进比起始标记少(2个空格)
// 起始标记缩进4个空格,结束标记缩进2个空格
String str2 = """
    第一行文本
      第二行文本
  """; // 结束标记缩进2个空格
// 最终输出(去除2个空格,剩余2个空格缩进):
//   第一行文本
//     第二行文本
// 示例3:结束标记无缩进(不推荐)
// 起始标记缩进4个空格,结束标记无缩进
String str3 = """
    第一行文本
      第二行文本
"""; // 结束标记无缩进
// 最终输出(保留全部4个空格缩进):
//     第一行文本
//       第二行文本

始终保持「起始标记、结束标记缩进一致」,且与代码块的缩进对齐(如在方法内部,与方法体的缩进保持一致),这样能最大程度保证文本块的格式整洁,避免出现不必要的缩进混乱。

四、转义字符的使用

文本块支持所有Java普通字符串的转义字符(如n、t、"等),同时新增了2个专属转义符,专门用于优化文本块的格式处理,解决特殊场景下的格式问题。

4.1 常用转义字符汇总

转义符

作用

适用场景

示例

n

手动换行(可省略,文本块自动识别换行)

需要强制换行,或在单行文本中插入换行

"""HellonWorld""" → 输出Hello换行World

t

制表符(等价于按一次Tab键)

格式化表格、代码片段,实现整齐缩进

"""姓名:t张三n年龄:t25"""

"

转义双引号,避免与文本块的"""冲突

文本中包含双引号(如JSON、HTML标签)

"""{"name": "Java"TextBlocks""}"""

转义反斜杠,避免被解析为转义符

文本中包含反斜杠(如文件路径、正则表达式)

"""C:Program FilesJava"""

s

代表一个空格(文本块专属,Java 14+ 支持)

需要固定空格,避免手动输入多个空格导致格式混乱

"""姓名:ss张三""" → 姓名: 张三

取消换行(文本块专属,Java 14+ 支持)

将多行文本合并为一行,避免自动换行

"""SELECT id FROM user""" → SELECT id FROM user

4.2 示例:转义字符的常见用法

// 1. 转义双引号(JSON场景)
String json = """
        {
          "id": 1001,
          "username": "zhangsan",
          "desc": "Java\"文本块\"实战" // 转义双引号,避免与"""冲突
        }""";
// 2. 取消换行(SQL场景,将多行SQL合并为一行)
String sql = """
        SELECT id, name, age \
        FROM user \
        WHERE age > 18 \
        ORDER BY age DESC""";
// 最终输出:SELECT id, name, age FROM user WHERE age > 18 ORDER BY age DESC
// 3. \s 固定空格(格式化输出)
String userInfo = """
        姓名:\s\s张三
        年龄:\s\s25
        职业:\s\s程序员
        地址:\s\s北京市海淀区""";
// 4. 转义反斜杠(文件路径场景)
String filePath = """
        C:\\Program Files\\Java\\jdk1.8.0_301
        """;

五、开发场景

文本块的核心价值的是简化多行字符串编写,以下是企业开发中最常见的5个场景,覆盖JSON、SQL、HTML、日志、模板等,直接复制就能用于项目开发。

场景1:编写JSON字符串

传统写法需要手动拼接、转义双引号,代码冗长且易出错;文本块可直接编写JSON格式,保留缩进和换行,可读性和可维护性大幅提升。

// 文本块写法(优雅简洁)
String userJson = """
        {
          "id": 1001,
          "username": "zhangsan",
          "password": "123456",
          "age": 28,
          "gender": "male",
          "address": "北京市海淀区",
          "hobbies": ["coding", "reading", "running"],
          "status": 1
        }""";
// 结合Jackson解析JSON(无缝衔接)
ObjectMapper objectMapper = new ObjectMapper();
User user = objectMapper.readValue(userJson, User.class);
System.out.println(user.getUsername()); // 输出:zhangsan

场景2:编写复杂SQL语句

复杂SQL(多表关联、子查询、条件筛选)通常需要换行排版,文本块可保留SQL的原始格式,避免拼接错误,后期修改时只需调整对应行即可。

// 文本块编写复杂SQL(多表关联)
String sql = """
        SELECT 
            u.id, 
            u.username, 
            u.age, 
            d.department_name, 
            d.department_address
        FROM 
            user u
        LEFT JOIN 
            department d ON u.department_id = d.id
        WHERE 
            u.age > 18 
            AND d.department_name LIKE '%技术%'
            AND u.status = 1
        ORDER BY 
            u.age DESC
        LIMIT 10""";
// 执行SQL(与普通字符串无区别)
PreparedStatement pstmt = connection.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();

场景3:生成HTML模板(邮件/静态页面)

在后端生成HTML页面(如验证码邮件、通知邮件、静态页面)时,文本块可直接编写HTML标签,保留页面结构,无需手动拼接标签和换行。

// 文本块编写HTML邮件模板
String emailTemplate = """
        <!DOCTYPE html>
        <html lang="zh-CN">
        <head>
            <meta charset="UTF-8">
            <title>验证码通知</title>
            <style>
                .container { width: 600px; margin: 0 auto; border: 1px solid #eee; padding: 20px; }
                .code { font-size: 36px; color: #007bff; font-weight: bold; margin: 20px 0; }
            </style>
        </head>
        <body>
            <div class="container">
                <h1>您的验证码已生成</h1>
                <p>尊敬的用户,您好!您的验证码为:</p>
                <div class="code">$[code]</div>
                <p>验证码有效期为10分钟,请及时使用,请勿泄露给他人。</p>
                <p>本邮件无需回复,如有疑问,请联系客服。</p>
            </div>
        </body>
        </html>""";
// 替换模板变量(结合String.format)
String emailContent = String.format(emailTemplate, "123456");

场景4:输出多行日志

对于复杂的操作日志,文本块可保留日志的换行和格式,比传统的单行日志更清晰,便于问题排查和日志分析。

// 文本块输出多行日志
LocalDateTime now = LocalDateTime.now();
log.info("""
        用户操作日志详情:
        操作时间:{}
        操作人:zhangsan
        操作ID:OP20240519001
        操作类型:查询用户信息
        操作参数:{id: 1001}
        操作结果:成功
        响应时间:50ms
        备注:无异常""", now);

场景5:编写多行注释/接口说明

对于复杂的接口说明、方法注释,文本块可保留换行和格式,比传统的多行注释(/* */)更灵活,也可用于生成接口文档的描述信息。

// 文本块编写接口说明
String apiDesc = """
        接口名称:查询用户信息接口
        接口路径:/api/user/getById
        请求方式:GET
        请求参数:
            id:Integer,必填,用户ID
        响应参数:
            id:Integer,用户ID
            username:String,用户名
            age:Integer,年龄
            address:String,地址
        异常说明:
            1. ID为null或小于0,返回400参数错误
            2. ID不存在,返回404用户不存在
            3. 系统异常,返回500服务器错误
        备注:该接口需登录后访问,携带Token""";

六、注意事项

文本块语法简单,但细节容易出错,以下是开发中最常见的5个坑点,附带错误示例和正确写法,帮你避开所有陷阱。

1:起始标记与文本内容同一行(编译报错)

// 错误示例
String error = """Hello World"""; 
// 编译报错:illegal start of expression(非法表达式开始)
// 原因:文本块的起始标记(""")必须单独一行,不能与文本内容同行
// 正确示例
String correct = """
        Hello World""";

2:缩进处理不当,导致格式混乱

// 错误示例(结束标记无缩进)
String str = """
        第一行文本
          第二行文本
"""; // 结束标记无缩进
// 最终输出(保留全部4个空格缩进):
//     第一行文本
//       第二行文本
// 正确示例(结束标记与起始标记缩进一致)
String str = """
        第一行文本
          第二行文本
        """; // 起始、结束标记均缩进4个空格
// 最终输出(去除4个空格,格式整洁):
// 第一行文本
//   第二行文本

3:忘记转义双引号,导致语法冲突

// 错误示例(文本中包含双引号,未转义) String json = """         {           "name": "Java"TextBlocks"" // 双引号未转义,与"""冲突         }"""; // 编译报错:unclosed string literal(未闭合的字符串字面量) // 正确示例(转义双引号) String json = """         {           "name": "Java"TextBlocks""         }""";

4:误认为文本块支持直接变量插值

Java文本块不支持直接的变量插值(如 、variable),很多开发者习惯了其他语言的变量插值,会误以为文本块也支持,导致变量无法替换。

// 错误示例(变量插值无效)
String name = "zhangsan";
String str = """
        姓名:${name}
        年龄:25"""; // 输出:姓名:${name},不会替换变量
// 正确示例(结合String.format()替换变量)
String str = String.format("""
                          姓名:%s
                          年龄:%d""", name, 25);
// 输出:
// 姓名:zhangsan
// 年龄:25
// 进阶:结合Apache Commons Text的StringSubstitutor实现更灵活的变量替换
StringSubstitutor substitutor = new StringSubstitutor(Map.of("name", "zhangsan", "age", "25"));
String str = substitutor.replace("""
        姓名:${name}
        年龄:${age}""");

5:文本块末尾多留空行

如果结束标记单独一行,且与最后一行文本之间有空白行,那么这个空白行会被保留在文本块中,可能导致格式异常(如JSON解析失败、SQL语法错误)。

// 错误示例(结束标记前多留空行)
String json = """
        {
          "id": 1001,
          "name": "zhangsan"
        }"""; // 最后一行文本与结束标记之间有空白行
// 最终输出会包含一个空白行,可能导致JSON解析失败
// 正确示例(结束标记与最后一行文本紧密衔接,无空白行)
String json = """
        {
          "id": 1001,
          "name": "zhangsan"
        }""";

八、全文总结

Java文本块是一款“小而美”的语法,核心价值在于「简化多行字符串编写」,无需手动拼接、无需换行符、无需频繁转义,让SQL、JSON、HTML等多行文本的编写变得优雅、高效。

掌握文本块的关键的是:牢记起始标记单独一行、缩进规则、转义技巧,避开常见坑点;同时明确文本块与普通字符串的等价性,无缝衔接现有String API。

在实际开发中,只要涉及多行字符串,优先使用文本块,既能减少代码量、降低错误率,也能提升代码的可读性和可维护性,是Java开发者必备的实用语法。

以上就是Java使用文本块(Text Blocks)处理多行字符串的操作方法的详细内容,更多关于Java文本块处理多行字符串的资料请关注脚本之家其它相关文章!

相关文章

  • java中PreparedStatement和Statement详细讲解

    java中PreparedStatement和Statement详细讲解

    这篇文章主要介绍了java中PreparedStatement和Statement详细讲解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • java线程同步操作实例详解

    java线程同步操作实例详解

    这篇文章主要介绍了java线程同步操作,结合实例形式分析了Java线程同步与锁机制相关原理、操作技巧与注意事项,需要的朋友可以参考下
    2018-09-09
  • 举例讲解Java中的Stream流概念

    举例讲解Java中的Stream流概念

    这篇文章主要介绍了举例讲解Java中的Stream流概念,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • spring jdbctemplate的用法小结

    spring jdbctemplate的用法小结

    jdbcTemplate是spring框架中提供的一个对象,是对原始繁杂的jdbc 对象的简单封装,本文通过实例代码介绍spring jdbctemplate的用法小结,需要的朋友可以参考下
    2023-04-04
  • JavaSE XML解析技术的使用方法详解

    JavaSE XML解析技术的使用方法详解

    XML意为可扩展标记语言,被多数技术人员用以选择作为数据传输的载体,成为一种通用的数据交换格式,下面这篇文章主要给大家介绍了关于JavaSE XML解析技术的使用方法,需要的朋友可以参考下
    2023-04-04
  • Java通过经纬度坐标获取两个点之间的直线距离的示例

    Java通过经纬度坐标获取两个点之间的直线距离的示例

    这篇文章主要介绍了Java通过经纬度坐标获取两个点之间的直线距离的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • SpringSecurity实现原理及多过滤器链匹配规则详解

    SpringSecurity实现原理及多过滤器链匹配规则详解

    SpringSecurity通过FilterChainProxy管理多个过滤器链,根据请求的URI和RequestMatcher匹配,选择合适的过滤器链进行认证和授权处理,配置多个过滤器链需用@Order区分优先级,处理流程清晰高效
    2025-10-10
  • 关于servlet向mysql添加数据时中文乱码问题的解决

    关于servlet向mysql添加数据时中文乱码问题的解决

    最近在工作中遇到一个小问题,出现了中文乱码的问题,无奈只能想办法解决,下面这篇文章主要给大家介绍了关于servlet向mysql添加数据时中文乱码问题的解决方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • Java代码发送post请求实现方式

    Java代码发送post请求实现方式

    本文介绍了使用Java发送POST请求的方法,包括引用工具类、设置访问地址、请求头和json请求体,最后使用工具类发送请求并返回结果
    2026-05-05
  • Java LocalDateTime常用操作方法

    Java LocalDateTime常用操作方法

    这篇文章主要介绍了Java LocalDateTime实用方法,Java8提供了新的时间接口LocalDateTime,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-01-01

最新评论