Java格式化输出全解析
立即解锁
发布时间: 2025-08-18 02:26:23 阅读量: 3 订阅数: 18 

### Java 格式化输出全解析
#### 1. 向命令行写入数据
在 Java 编程中,我们常常使用 `PrintStream` 类的 `println()` 方法将格式化信息输出到屏幕。例如在 `System.out.println()` 表达式中,`out` 对象就是 `PrintStream` 类型。这个类可以将任何基本类型的数据作为字符串输出,比如一个 `int` 类型的值 `12345`,会通过 `String` 类的 `valueOf()` 方法转换为字符串 `"12345"`。
除了 `PrintStream` 类,`PrintWriter` 类也能实现相同的功能,因为它具备 `PrintStream` 类提供的所有方法。这两个类的主要区别在于,调用 `println()` 方法时,`PrintWriter` 类可以控制是否刷新流缓冲区,而 `PrintStream` 类则无法控制。当启用自动刷新时,`PrintWriter` 类只有在调用 `println()` 方法之一时才会刷新流缓冲区;而 `PrintStream` 对象只要向流中写入换行符,无论使用的是 `print()` 还是 `println()` 方法,都会刷新流缓冲区。
`PrintWriter` 和 `PrintStream` 类都能将基本数据格式化为字符。除了 `print()` 和 `println()` 方法,它们还定义了 `printf()` 方法。这个方法能让我们对输出格式有更多的控制,并且可以接受任意数量的参数进行格式化和显示。
#### 2. `printf()` 方法详解
`PrintStream` 和 `PrintWriter` 类中定义的 `printf()` 方法可以为各种类型的任意值序列生成格式化输出,格式化的方式由该方法的第一个参数指定。`System.out` 恰好是 `PrintStream` 类型,因此我们可以使用 `printf()` 方法向命令行生成格式化输出。这两个类定义了 `printf()` 方法的两个版本,具体如下表所示:
| 版本 | 描述 |
| --- | --- |
| `printf( String format, Object ... args)` | 根据 `format` 中的格式规范输出 `args` 中元素的值。如果 `format` 为 `null`,则会抛出 `NullPointerException` 异常。 |
| `printf( Locale loc, String format, Object ... args)` | 此版本的功能与前一个版本相同,不同之处在于输出会根据第一个参数指定的区域设置进行调整。 |
格式参数是一个字符串,对于跟随格式参数的每个参数值,该字符串至少应包含一个格式规范。参数值的格式规范定义了数据的呈现方式,其一般形式如下:
```plaintext
%[argument_index$][flags][width][.precision]conversion
```
格式规范各组件周围的方括号表示这些组件是可选的。如果省略所有可选部分,最小的格式规范就是 `%conversion`。格式规范各组件的选项如下表所示:
| 选项 | 描述 |
| --- | --- |
| `conversion` | 这是一个单字符,用于指定参数的呈现方式。常用的值有:<br> - `'d'`、`'o'` 和 `'x'` 适用于整数值,分别指定输出表示应为十进制、八进制或十六进制。<br> - `'f'`、`'g'` 和 `'a'` 适用于浮点值,分别指定输出表示应为十进制表示法、科学记数法(带指数)或带指数的十六进制。<br> - `'c'` 指定参数值是一个字符,应按字符形式显示。<br> - `'s'` 指定参数是一个字符串。<br> - `'b'` 指定参数是一个布尔值,输出为 `"true"` 或 `"false"`。<br> - `'h'` 指定以十六进制形式输出参数的哈希码。<br> - `'n'` 指定平台行分隔符,因此 `"%n"` 与 `"\n"` 效果相同。 |
| `argument_index` | 这是一个十进制整数,通过其序号标识跟随格式字符串的参数之一,其中 `"1$"` 指第一个参数,`"2$"` 指第二个参数,依此类推。也可以使用 `<` 代替序号加 `$`,表示该参数应与格式字符串中前一个格式规范指定的参数相同。 |
| `flags` | 这是一组标志字符,用于修改输出格式。有效的标志字符取决于指定的转换。最常用的标志字符有:<br> - `-` 和 `^` 适用于任何类型,分别指定输出应左对齐和大写。<br> - `+` 强制为数值输出符号。<br> - `0` 强制为数值进行零填充。 |
| `width` | 指定输出参数的字段宽度,表示要写入输出的最小字符数。 |
| `precision` | 根据转换的不同,以某种方式限制输出。其主要用途是在输出浮点值时指定精度的位数。 |
下面通过具体示例来详细说明如何使用这些格式规范。
#### 3. 格式化数值数据
为了便于测试,我们可以创建一个包含空 `main()` 方法的程序源文件,将一系列代码片段插入其中进行测试。以下是一些简单的示例:
```java
int a = 5, b = 15, c = 255;
double x = 27.5, y = 33.75;
System.out.printf("x = %f y = %g", x, y);
System.out.printf(" a = %d b = %x c = %o", a, b, c);
```
执行上述代码片段,会产生以下输出:
```plaintext
x = 27.500000 y = 33.750000 a = 5 b = f c = 377
```
在这个例子中,没有指定每个格式说明符应用于哪个参数,因此默认操作是按照格式说明符和参数出现的顺序进行匹配。从输出结果可以看出,浮点值的小数点后会显示六位小数,并且字段宽度会根据输出值的字符数进行调整。虽然有两条输出语句,但所有输出都显示在同一行,这表明 `printf()` 方法的工作方式与 `print()` 方法类似,都是从当前光标位置开始将输出传输到命令行。
整数的输出也有默认的字段宽度,足以容纳输出值的字符数。这里我们看到了以普通十进制、十六进制和八进制表示的输出值。需要注意的是,参数的数量至少要与格式说明符的数量相同。如果在最后一次 `printf()` 调用中移除 `c` 参数,会抛出 `MissingFormatArgumentException` 异常;如果参数数量多于格式字符串中的格式说明符数量,多余的参数将被忽略。
我们可以通过引入参数索引来改变参数的输出顺序,示例代码如下:
```java
int a = 5, b = 15, c = 255;
double x = 27.5, y = 33.75;
System.out.printf("x = %2$f y = %1$g", x, y);
System.out.printf(" a = %3$d b = %1$x c = %2$o", a, b, c);
```
执行上述代码,输出结果如下:
```plaintext
x = 33.750000 y = 27.500000 a = 255 b = 5 c
```
0
0
复制全文
相关推荐










