0

0

在Java中Formatter类如何格式化输出_Java格式化工具解析

P粉602998670

P粉602998670

发布时间:2026-02-03 13:04:02

|

987人浏览过

|

来源于php中文网

原创

不该直接 new Formatter() 做字符串格式化,因其设计初衷是绑定 Appendable(如 StringBuilder、FileWriter),不返回字符串且需手动 toString()、flush() 或 close(),易出错;应优先使用 String.format() 或 System.out.printf()。

在java中formatter类如何格式化输出_java格式化工具解析

Java 的 Formatter 类不是“格式化工具”,它是一个底层的、面向字符流的格式化引擎,不直接用于日常字符串拼接或日志输出;真正该用的是 String.format()System.out.printf()MessageFormat

为什么不该直接 new Formatter() 做字符串格式化

Formatter 设计初衷是绑定到某个 Appendable(如 StringBuilderFileWriterPrintStream),它本身不返回字符串,也不缓存结果。手动用它拼字符串既冗余又易错。

  • 必须显式传入 Appendable,比如 new Formatter(new StringBuilder())
  • 调用 format() 后需手动调用 toString()(如果底层是 StringBuilder)才能拿到结果
  • 忘记关闭或重用实例可能引发状态残留(如 locale、flags 被污染)
  • 相比 String.format(),没有异常自动包装(IllegalFormatConversionException 会直接抛出,不转成 RuntimeException

Formatter.format() 和 String.format() 的参数完全一致

所有转换符(%s%d%f)、标志(- 左对齐、0 补零)、宽度、精度写法都一样,区别只在调用方式和目标对象。

String s1 = String.format("Name: %s, Age: %d", "Alice", 30); // ✅ 简洁安全

StringBuilder sb = new StringBuilder();
Formatter f = new Formatter(sb);
f.format("Name: %s, Age: %d", "Alice", 30); // ✅ 参数相同,但步骤多
String s2 = sb.toString();

注意:Formatter 不支持 null 安全——若传入 null%s,会输出字符串 "null",而非抛异常;而 String.format() 行为一致,这点无差异。

立即学习Java免费学习笔记(深入)”;

速创猫AI简历
速创猫AI简历

一键生成高质量简历

下载

Formatter 的真实适用场景:定制输出目标

只有当你需要把格式化结果写入非内存目标时,Formatter 才不可替代:

  • 写入文件:new Formatter(new FileWriter("log.txt"))
  • 写入 Socket 输出流:new Formatter(socket.getOutputStream())
  • 配合自定义 Appendable 实现日志缓冲、长度截断等逻辑

此时要注意:必须显式调用 flush()close()(尤其涉及 I/O 流时),否则内容可能滞留在缓冲区中不落地。

常见错误:忽略 locale 导致数字/日期格式异常

Formatter 默认使用 JVM 启动时的默认 locale,但 String.format() 也是。问题常出现在多线程环境或动态切换 locale 的应用中:

  • new Formatter(appendable, Locale.US) 显式指定 locale,避免千分位符、小数点变成逗号
  • 不要依赖 Formatter.getInstance()(不存在!这是常见误记)
  • 日期格式化慎用 %t 系列:它依赖 locale 的缩写和顺序,Locale.CHINA%tFyyyy-MM-ddLocale.US 下仍是同格式,但 %tc 输出差异极大

真正难处理的是嵌套格式(如动态字段宽度:%),这种写法可读性差、调试困难,建议拆成两步或改用 MessageFormat

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

543

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

238

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

519

2024.03.01

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

844

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

439

2024.06.27

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

75

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

287

2023.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

361

2023.08.03

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

13

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.2万人学习

C# 教程
C# 教程

共94课时 | 8.4万人学习

Java 教程
Java 教程

共578课时 | 56.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号