Formatter 本身不输出,需指定 Appendable 目标;format() 不自动换行或刷新,须用 %n、flush() 或 try-with-resources 确保正确输出。

Java 中 Formatter 类本身不直接提供“格式化输出”功能,它只负责格式化字符串;真正完成输出的是配合它的目标(比如 System.out、StringBuilder 或文件流)。误以为调用 Formatter 构造方法就自动打印,是新手最常踩的坑。
Formatter 构造时必须指定输出目标
Formatter 是一个“写入器”,不是“打印机”。它需要一个 Appendable 实例来写入格式化后的内容。没指定目标,或目标为 null,会抛 NullPointerException;目标不可写(如只读流),会抛 IOException。
常见合法目标:
-
new Formatter(System.out)—— 输出到控制台(但通常更推荐用System.out.printf()) -
new Formatter(sb),其中sb是StringBuilder—— 写入可变字符串 -
new Formatter(new File("out.txt"))—— 写入文件(需处理FileNotFoundException) -
new Formatter(ByteArrayOutputStream)—— 写入字节流,适合后续编码处理
format() 方法不会自动刷新或换行
调用 formatter.format("%d %s", 42, "hello") 只是把内容写入目标,不会追加 \n,也不会触发缓冲区刷新(尤其对文件或管道流)。这会导致:
立即学习“Java免费学习笔记(深入)”;
- 控制台输出粘连(多行挤在同一行)
- 文件写入后看不到内容(缓冲未刷出)
-
toString()在StringBuilder上取不到最新结果(如果中间没调用flush()或没 close)
正确做法:
- 显式加换行符:
formatter.format("%d %s%n", 42, "hello")(%n是平台安全的换行) - 手动刷新:
formatter.flush()(对流类目标必要) - 用 try-with-resources 自动 close(推荐用于文件):
try (Formatter f = new Formatter("log.txt")) { f.format("[%tF %Formatter 和 String.format() / printf() 的关键区别
三者共享同一套格式语法(
%d、%s、%06x等),但行为和生命周期不同:-
String.format():纯函数式,返回新字符串,无状态,线程安全 -
PrintStream.printf()(如System.out.printf()):内部封装了Formatter,自动刷新,语义更贴近“输出” -
Formatter:有状态对象(维护位置、locale、输出目标),可复用,但需手动管理生命周期(flush/close),非线程安全
例如 locale 设置只对当前
Formatter实例生效:new Formatter(Locale.FRANCE).format("%,.2f", 1234.5)输出1 234,50,而String.format()默认用系统 locale。真正用好
Formatter,关键是把它当成“带格式能力的写入器”,而不是“高级 println”。目标选错、不 flush、忽略异常、混淆线程安全性——这些细节比格式语法本身更容易导致问题。相关文章
在Java里如何通过Maven下载依赖_Java依赖管理配置说明
在Java中ForkJoinPool适合哪些任务_Java并行计算模型说明
在Java里Timer和TimerTask如何实现定时任务_Java定时任务工具说明
在Java里Charset类如何处理字符编码_Java编码转换解析
java抽象方法作用_模板方法设计模式与提高代码扩展性解析
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
更多热门AI工具
更多相关专题
string转int在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。
626
2023.08.02
c语言中null和NULL的区别c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。
241
2023.09.22
java中null的用法在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。
641
2024.03.01
format在python中的用法Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。
864
2023.07.31
python中的format是什么意思python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
440
2024.06.27
fprintf和printf的区别fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。
290
2023.11.28
js 字符串转数组js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。
424
2023.08.03
更多热门下载
更多相关下载
更多精品课程
更多最新文章
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
-



