在线工具站
- 推荐一个程序员在线工具站:程序员常用工具(http://cxytools.com),有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具,效率加倍嘎嘎好用。
程序员资料站
- 推荐一个程序员编程资料站:程序员的成长之路(http://cxyroad.com),收录了一些列的技术教程、各大面试专题,还有常用开发工具的教程。
小报童专栏精选Top100
- 推荐一个小报童专栏导航站:小报童精选Top100(http://xbt100.top),收录了生财有术项目精选、AI海外赚钱、纯银的产品分析等专栏,陆续会收录更多的专栏,欢迎体验~
在 Java 编程中,字符串的格式化是一个常见的需求,无论是为了生成用户友好的输出,还是为了记录日志。Java 提供了强大的 Formatter
类来实现灵活而复杂的格式化功能。
1. Formatter
类概述
1.1 定义
Formatter
类位于 java.util
包中,是一个用于生成格式化输出的工具类。它提供了对字符串、数字、日期等多种类型的格式化支持。定义如下:
public final class Formatter implements Closeable, Flushable {
// 构造方法和主要方法省略
}
1.2 主要特点
- 多样化的格式化支持:支持字符串、数字、日期等多种类型的格式化。
- 灵活的输出控制:可以输出到控制台、文件、网络等各种目标。
- 国际化支持:支持根据本地化设置进行格式化。
2. 常用方法
2.1 构造方法
Formatter
类提供了多种构造方法,用于指定输出目标和本地化设置。
// 创建一个输出到控制台的 Formatter
Formatter formatter = new Formatter();
// 创建一个输出到文件的 Formatter
Formatter formatter = new Formatter(new File("output.txt"));
// 创建一个指定本地化设置的 Formatter
Formatter formatter = new Formatter(Locale.US);
2.2 format
方法
format
方法是 Formatter
类的核心方法,用于生成格式化输出。
public Formatter format(String format, Object... args)
示例
Formatter formatter = new Formatter();
formatter.format("Hello, %s!", "world");
System.out.println(formatter); // 输出:Hello, world!
2.3 flush
方法
flush
方法用于刷新输出流,将缓冲区中的数据写入目标。
public void flush()
2.4 close
方法
close
方法用于关闭 Formatter
,释放资源。
public void close()
2.5 out
方法
out
方法返回 Formatter
的输出目标,可以是 Appendable
对象或 OutputStream
。
public Appendable out()
3. 格式化字符串
3.1 占位符
Formatter
类支持多种占位符,用于格式化不同类型的数据。常用占位符如下:
- %s:字符串
- %d:整数
- %f:浮点数
- %t:日期/时间
- %%:百分号
示例
Formatter formatter = new Formatter();
formatter.format("Name: %s, Age: %d, GPA: %.2f", "Alice", 30, 3.75);
System.out.println(formatter); // 输出:Name: Alice, Age: 30, GPA: 3.75
3.2 日期/时间格式化
Formatter
类支持丰富的日期/时间格式化功能,通过 %t
占位符进行格式化。
常用日期/时间格式化符号
- %tY:年份(4位)
- %tm:月份(2位)
- %td:日期(2位)
- %tH:小时(2位,24小时制)
- %tM:分钟(2位)
- %tS:秒(2位)
示例
Date date = new Date();
Formatter formatter = new Formatter();
formatter.format("Date: %tY-%tm-%td %tH:%tM:%tS", date, date, date, date, date, date);
System.out.println(formatter); // 输出:Date: 2023-07-09 15:23:45
3.3 组合格式化
可以组合使用多个占位符来生成复杂的格式化字符串。
示例
Date date = new Date();
Formatter formatter = new Formatter();
formatter.format("User: %s, Logged in at: %tH:%tM:%tS on %tY-%tm-%td", "Bob", date, date, date, date, date, date);
System.out.println(formatter); // 输出:User: Bob, Logged in at: 15:23:45 on 2023-07-09
4. 高级用法
4.1 自定义格式化
通过实现 Formattable
接口,可以自定义对象的格式化行为。
示例
import java.util.Formattable;
import java.util.FormattableFlags;
import java.util.Formatter;
import java.util.Locale;
public class CustomFormattable implements Formattable {
private String value;
public CustomFormattable(String value) {
this.value = value;
}
@Override
public void formatTo(Formatter formatter, int flags, int width, int precision) {
StringBuilder sb = new StringBuilder();
// 处理 UPPERCASE 标志
String formattedValue = ((flags & FormattableFlags.UPPERCASE) == FormattableFlags.UPPERCASE) ? value.toUpperCase() : value;
// 处理 LEFT_JUSTIFY 标志
if ((flags & FormattableFlags.LEFT_JUSTIFY) == FormattableFlags.LEFT_JUSTIFY) {
sb.append(String.format("%-" + width + "s", formattedValue));
} else {
sb.append(String.format("%" + width + "s", formattedValue));
}
// 处理 ALTERNATE 标志
if ((flags & FormattableFlags.ALTERNATE) == FormattableFlags.ALTERNATE) {
sb.insert(0, "#");
}
formatter.format(sb.toString());
}
public static void main(String[] args) {
CustomFormattable customFormattable = new CustomFormattable("hello");
Formatter formatter = new Formatter();
formatter.format("%s%n", customFormattable); // 默认格式
formatter.format("%S%n", customFormattable); // 大写格式
formatter.format("%-10s%n", customFormattable); // 左对齐格式
formatter.format("%#10S%n", customFormattable); // 备用格式(大写,右对齐,左填充空格)
System.out.println(formatter);
}
}
运行上述代码,将输出:
hello
HELLO
hello
# HELLO
4.2 本地化支持
Formatter
类支持根据本地化设置进行格式化,确保不同地区的用户看到适合其习惯的格式。
示例
Formatter formatter = new Formatter(Locale.FRANCE);
formatter.format("Locale specific output: %s", "Bonjour");
System.out.println(formatter); // 输出:Locale specific output: Bonjour
4.3 多线程环境
在多线程环境中使用 Formatter
时,需要注意线程安全问题。Formatter
类本身是线程不安全的,因此需要进行同步控制。
示例
Formatter formatter = new Formatter();
synchronized (formatter) {
formatter.format("Thread-safe output: %s", "Hello");
System.out.println(formatter);
}
5. 性能考虑
使用 Formatter
进行格式化时,需要注意以下几点:
- 性能开销:复杂的格式化操作可能会带来一定的性能开销,需要在性能敏感的场景中进行评估和优化。
- 资源管理:在使用完
Formatter
后,应该及时调用close
方法释放资源,避免资源泄露。 - 多线程环境:在多线程环境中使用
Formatter
时,需要进行同步控制,确保线程安全。
6. 扩展阅读
6.1 String.format
方法
String.format
方法是 Formatter
类的便捷封装,用于生成格式化字符串。建议阅读 String.format 的官方文档。
6.2 MessageFormat
类
MessageFormat
类是 Java 中另一种格式化工具,特别适用于本地化消息的格式化。建议阅读 MessageFormat 的官方文档。