Java学习之——“IO流“的进阶流之打印流的学习

发布于:2025-09-13 ⋅ 阅读:(18) ⋅ 点赞:(0)

       打印流是Java IO包中非常实用的高级流,主要包括PrintStreamPrintWriter两个类。它们提供了丰富的方法来输出各种数据类型,并且具有自动刷新、异常处理等特性。

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的使用,可以大大提高输出处理的效率和代码的可读性。特别是在需要格式化输出或重定向系统输出的场景中,打印流表现出色。