在 Java 中,java.io.PrintWriter 类为开发者提供了向底层 Writer 写入格式化数据的便利。它能够把 int、long 等原始数据类型转换为文本形式进行写入,而非直接写入其对应的字节值。
当你需要生成包含文本和数字的报告(或类似的文档)时,PrintWriter 类就会发挥极大的作用。它除了具备写入原始字节的方法外,还拥有与 PrintStream 类相同的全部方法。作为 Writer 类的子类,PrintWriter 类的核心功能就是专注于文本的写入操作。
下面是一个简单的 PrintWriter 示例:
package com.hxstrive.java_io; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; public class PrintWriterExample { public static void main(String[] args) { // 用于将数据写入文件的 PrintWriter try (PrintWriter fileWriter = new PrintWriter(new FileWriter("output.txt")); // 用于将数据输出到控制台的 PrintWriter PrintWriter consoleWriter = new PrintWriter(System.out)) { // 定义一些示例数据 String name = "Alice"; int age = 25; double height = 1.65; // 写入文件 fileWriter.println("Name: " + name); fileWriter.printf("Age: %d%n", age); fileWriter.printf("Height: %.2f meters%n", height); // 输出到控制台 consoleWriter.println("Name: " + name); consoleWriter.printf("Age: %d%n", age); consoleWriter.printf("Height: %.2f meters%n", height); // 刷新输出流,确保数据被写入 fileWriter.flush(); consoleWriter.flush(); } catch (IOException e) { System.err.println("An error occurred while writing to the file: " + e.getMessage()); } } }
输出结果:
Name: Alice Age: 25 Height: 1.65 meters
该示例首先创建了一个 PrintWriter 实例,该实例与 FileWriter 相连。其次,示例向 PrintWriter 写入布尔值、int 值和浮点数。第三,示例调用了 PrintWriter 的高级 printf() 方法,该方法可以在文本字符串中插入格式化的数字。最后关闭 PrintWriter。
PrintWriter 有多种构造函数可供选择,使您可以将其连接到文件、OutputStream 或 Writer。在这方面,PrintWriter 与其他 Writer 子类有些不同,其他 Writer 子类的构造函数大多可以将其他 Writer 实例作为参数(除了 OutputStreamWriter 等少数几个子类)。
PrintWriter 类包含功能强大的 format() 和 printf() 方法。这两个方法的功能完全相同,但“printf ”这个名字对于 C 程序员来说更为熟悉。通过 format() 和 printf() 方法,您可以使用格式化字符串方式混合文本和数据。
以下是一些常用的格式字符:
%d:用于输出十进制整数。
int num = 123; System.out.printf("The number is %d%n", num);
%x 或 %X:用于输出十六进制整数,%x 输出小写十六进制,%X 输出大写十六进制。
int hexNum = 255; System.out.printf("Hexadecimal: %x, Uppercase Hexadecimal: %X%n", hexNum, hexNum);
%o:用于输出八进制整数。
int octNum = 64; System.out.printf("Octal: %o%n", octNum);
%f:用于输出十进制浮点数,默认保留 6 位小数。
double floatNum = 3.14159; System.out.printf("Float number: %f%n", floatNum);
%e 或 %E:用于以科学计数法输出浮点数,%e 输出小写 e,%E 输出大写 E。
double scientificNum = 123456789; System.out.printf("Scientific notation: %e, Uppercase: %E%n", scientificNum, scientificNum);
%g 或 %G:会根据数值大小自动选择 %f 或 %e 格式输出,%g 输出小写,%G 输出大写。
double autoNum = 0.0000123; System.out.printf("Auto format: %g, Uppercase: %G%n", autoNum, autoNum);
%c:用于输出单个字符。
char ch = 'A'; System.out.printf("Character: %c%n", ch);
%s:用于输出字符串。
String str = "Hello"; System.out.printf("String: %s%n", str);
%b:用于输出布尔值。
boolean bool = true; System.out.printf("Boolean: %b%n", bool);
%%:用于输出百分号 %。
System.out.printf("Percentage: 50%%%n");
%n:用于输出平台特定的换行符。
System.out.printf("Line 1%nLine 2%n");
除了格式字符,还可以使用修饰符来进一步控制输出格式,例如指定宽度、精度、左对齐等:
宽度:在格式字符前指定一个整数,表示输出的最小宽度。
int num = 123; System.out.printf("Number with width 10: %10d%n", num);
精度:对于浮点数,在宽度后使用 . 加上一个整数表示保留的小数位数。
double floatNum = 3.14159; System.out.printf("Float with 2 decimal places: %.2f%n", floatNum);
左对齐:在宽度前加上 - 表示左对齐。
String str = "Hello"; System.out.printf("Left-aligned string: %-10s%n", str);
这些格式字符和修饰符能帮助你灵活地控制输出的格式,以满足不同的需求。
有关 format() 和 printf() 的更多信息,请参阅本页:
https://docs.oracle.com/javase/tutorial/java/data/numberformat.html
当你完成向 PrintWriter 写入字符后,必须要关闭它。关闭 PrintWriter 也会关闭 PrintWriter 写入的 Writer 实例。
关闭 PrintWriter 仅需要调用它的 close() 方法。下面是关闭 PrintWriter 的过程:
printWriter.close();
您还可以使用 Java 7 中引入的 try-with-resources 结构,自动关闭 PrintWriter,如下:
FileWriter writer = new FileWriter("output.txt"); try(PrintWriter printWriter = new PrintWriter(writer)) { printWriter.write("Hello World "); }
上述示例中,FileWriter 实例并没有在 try-with-resources 代码块中创建。这意味着 try-with-resources 块不会自动关闭 FileWriter 实例。不过,当 PrintWriter 关闭时,它也会关闭它所写入的 FileWriter 实例,因此 FileWriter 实例会在 PrintWriter 关闭时被关闭。