解析Java中1000个常用类:Formatter类,你学会了吗?

在线工具站
  • 推荐一个程序员在线工具站:程序员常用工具(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 的官方文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

良月柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值