打印流是Java IO包中非常实用的高级流,主要包括PrintStream和PrintWriter两个类。它们提供了丰富的方法来输出各种数据类型,并且具有自动刷新、异常处理等特性。
1.打印流的特点
- 不会抛出IOException:打印流捕获所有IO异常,通过
checkError()
方法检查错误状态 - 自动刷新功能:可配置自动刷新模式,调用
println()
,printf()
或format()
后自动刷新缓冲区 - 丰富的输出方法:提供了多种
print()
和println()
方法重载,支持各种数据类型 - 格式化输出:支持类似C语言的printf风格格式化输出
- 字符编码支持:可以指定字符编码(特别是PrintWriter)
2.PrintStream与PrintWriter的区别
特性 | PrintStream | PrintWriter |
---|---|---|
处理类型 | 字节流 | 字符流 |
字符编码 | 使用平台默认编码,可指定 | 可指定字符编码 |
自动刷新 | 仅当调用println()时 | 可配置自动刷新模式 |
异常处理 | 通过checkError()检查 | 通过checkError()检查 |
3.打印流常用方法详解
(1). 输出方法
print(数据类型)
:输出各种数据类型println(数据类型)
:输出各种数据类型并换行println()
:输出空行
(2).格式化方法
printf(String format, Object... args)
:格式化输出format(String format, Object... args)
:同上,与printf功能相同
(3). 其他方法
flush()
:刷新流close()
:关闭流checkError()
:检查错误状态
4.格式化符号说明
符号 | 说明 | 示例 |
---|---|---|
%d | 十进制整数 | 123 |
%x | 十六进制整数 | 7b |
%o | 八进制整数 | 173 |
%f | 浮点数 | 3.14 |
%e | 科学计数法 | 3.14e+00 |
%s | 字符串 | "hello" |
%c | 字符 | 'A' |
%b | 布尔值 | true |
%t | 日期时间 | 12:30:45 |
%n | 换行符 |
5.核心代码示例
import java.io.*;
import java.util.Date;
public class PrintStreamDetailedDemo {
public static void main(String[] args) {
// 1. 基本PrintStream使用
basicPrintStreamUsage();
// 2. 基本PrintWriter使用
basicPrintWriterUsage();
// 3. 格式化输出示例
formattedOutput();
// 4. 重定向系统输出
redirectSystemOutput();
// 5. 异常处理示例
exceptionHandling();
}
// 基本PrintStream使用
private static void basicPrintStreamUsage() {
try (PrintStream ps = new PrintStream("printstream_output.txt")) {
ps.println("=== PrintStream基本使用 ===");
ps.print("整数: ");
ps.println(100);
ps.print("浮点数: ");
ps.println(3.14159);
ps.print("布尔值: ");
ps.println(true);
ps.print("字符: ");
ps.println('A');
ps.print("对象: ");
ps.println(new Date());
} catch (FileNotFoundException e) {
System.err.println("文件未找到: " + e.getMessage());
}
}
// 基本PrintWriter使用
private static void basicPrintWriterUsage() {
try (PrintWriter pw = new PrintWriter("printwriter_output.txt")) {
pw.println("=== PrintWriter基本使用 ===");
pw.print("整数: ");
pw.println(200);
pw.print("浮点数: ");
pw.println(2.71828);
pw.print("布尔值: ");
pw.println(false);
pw.print("字符: ");
pw.println('B');
pw.print("对象: ");
pw.println(new Date());
} catch (FileNotFoundException e) {
System.err.println("文件未找到: " + e.getMessage());
}
}
// 格式化输出示例
private static void formattedOutput() {
try (PrintWriter pw = new PrintWriter("formatted_output.txt")) {
pw.println("=== 格式化输出示例 ===");
// 使用printf进行格式化输出
pw.printf("整数: %d, 十六进制: %x, 八进制: %o%n", 255, 255, 255);
pw.printf("浮点数: %.2f, 科学计数法: %.2e%n", 3.14159, 314159.0);
pw.printf("字符串: %s, 字符: %c%n", "Hello", 'A');
pw.printf("布尔值: %b%n", true);
pw.printf("当前时间: %tT, 日期: %tF%n", new Date(), new Date());
pw.printf("宽度和对齐: |%10d|, |%-10d|%n", 123, 123);
pw.printf("前导零: %05d%n", 42);
// 使用format方法(与printf相同)
pw.format("格式化的金额: $%,.2f%n", 1234567.89);
} catch (FileNotFoundException e) {
System.err.println("文件未找到: " + e.getMessage());
}
}
// 重定向系统输出
private static void redirectSystemOutput() {
try {
// 保存原始System.out
PrintStream originalOut = System.out;
// 重定向到文件
PrintStream fileOut = new PrintStream("system_output.txt");
System.setOut(fileOut);
System.out.println("=== 系统输出重定向示例 ===");
System.out.println("这行文字将输出到文件而不是控制台");
System.out.printf("当前时间: %tT%n", new Date());
// 执行一些计算并输出
for (int i = 1; i <= 5; i++) {
System.out.printf("%d的平方: %d%n", i, i * i);
}
// 恢复原始System.out
System.setOut(originalOut);
fileOut.close();
System.out.println("系统输出已恢复,这行文字显示在控制台");
} catch (FileNotFoundException e) {
System.err.println("文件未找到: " + e.getMessage());
}
}
// 异常处理示例
private static void exceptionHandling() {
try (PrintStream ps = new PrintStream("exception_test.txt")) {
// 正常输出
ps.println("正常输出测试");
// 模拟错误 - 关闭底层流后尝试输出
ps.close();
ps.println("这行不会输出,因为流已关闭");
} catch (FileNotFoundException e) {
System.err.println("文件未找到: " + e.getMessage());
}
// 使用checkError检查错误状态
PrintStream ps = new PrintStream(new OutputStream() {
@Override
public void write(int b) throws IOException {
throw new IOException("模拟写入错误");
}
});
ps.print("测试错误");
if (ps.checkError()) {
System.out.println("检测到打印流错误");
}
ps.close();
}
}
打印流是Java IO系统中非常实用的高级流,提供了丰富的输出功能和便捷的异常处理机制。通过掌握PrintStream和PrintWriter的使用,可以大大提高输出处理的效率和代码的可读性。特别是在需要格式化输出或重定向系统输出的场景中,打印流表现出色。