Java学习之——“IO流“的进阶流之打印流的学习
打印流是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.outPrintStream 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.outSystem.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() {@Overridepublic void write(int b) throws IOException {throw new IOException("模拟写入错误");}});ps.print("测试错误");if (ps.checkError()) {System.out.println("检测到打印流错误");}ps.close();}
}
打印流是Java IO系统中非常实用的高级流,提供了丰富的输出功能和便捷的异常处理机制。通过掌握PrintStream和PrintWriter的使用,可以大大提高输出处理的效率和代码的可读性。特别是在需要格式化输出或重定向系统输出的场景中,打印流表现出色。