Java IO 教程

Java IO:PrintWriter 类

在 Java 中,java.io.PrintWriter 类为开发者提供了向底层 Writer 写入格式化数据的便利。它能够把 int、long 等原始数据类型转换为文本形式进行写入,而非直接写入其对应的字节值。

当你需要生成包含文本和数字的报告(或类似的文档)时,PrintWriter 类就会发挥极大的作用。它除了具备写入原始字节的方法外,还拥有与 PrintStream 类相同的全部方法。作为 Writer 类的子类,PrintWriter 类的核心功能就是专注于文本的写入操作。

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 等少数几个子类)。

print() 和 format()

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 也会关闭 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 关闭时被关闭。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号