ZetCode

Java PrintStream 类

最后修改时间:2025 年 4 月 16 日

java.io.PrintStream 类为其他输出流添加了功能。 它提供了方便地打印各种数据值的方法。 与其他输出流不同,它永远不会抛出 IOException。

当写入换行符时,PrintStream 会自动刷新其缓冲区。 它会自动处理字符编码转换。 此类通常通过 System.out 用于标准输出。

PrintStream 类概述

PrintStream 扩展了 FilterOutputStream 并提供了格式化的输出功能。 关键方法包括各种 print 和 println 方法、format/printf 方法和错误检查。 所有方法都处理字符转换。

public class PrintStream extends FilterOutputStream
    implements Appendable, Closeable {
    public PrintStream(OutputStream out);
    public PrintStream(OutputStream out, boolean autoFlush);
    public PrintStream(OutputStream out, boolean autoFlush, String encoding);
    public PrintStream(String fileName);
    public PrintStream(File file);
    public void print(boolean b);
    public void print(char c);
    public void print(int i);
    public void print(long l);
    public void print(float f);
    public void print(double d);
    public void print(char[] s);
    public void print(String s);
    public void print(Object obj);
    public void println();
    public void println(boolean x);
    // ... other println methods
    public PrintStream printf(String format, Object... args);
    public PrintStream format(String format, Object... args);
    public void write(int b);
    public void write(byte[] buf, int off, int len);
    public boolean checkError();
    public void close();
}

上面的代码显示了 PrintStream 提供的关键方法。 这些方法允许方便地输出各种数据类型。 该类实现了 Appendable 用于字符串连接操作。

创建 PrintStream

可以从 OutputStream、文件路径或 File 对象创建 PrintStream。 您可以指定自动刷新行为和字符编码。 auto-flush 参数确定流是否在换行时刷新。

Main.java
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;

public class Main {

    public static void main(String[] args) {
        try {
            // Create from OutputStream with auto-flush
            PrintStream ps1 = new PrintStream(
                new FileOutputStream("output1.txt"), true);
            
            // Create from file path with specified encoding
            PrintStream ps2 = new PrintStream("output2.txt", "UTF-8");
            
            // Create from File object
            PrintStream ps3 = new PrintStream(new File("output3.txt"));
            
            System.out.println("Three PrintStreams created successfully");
            
            ps1.close();
            ps2.close();
            ps3.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

此示例演示了创建 PrintStream 的不同方法。 第一个使用启用了自动刷新的 OutputStream。 第二个指定 UTF-8 编码。 第三个是从 File 对象创建的。 完成后始终关闭流。

基本 Print 和 Println 方法

PrintStream 为所有原始类型和对象提供 print 和 println 方法。 println 变体在打印后添加换行符。 这些方法永远不会抛出 IOExceptions,而是设置一个内部错误标志。

Main.java
import java.io.PrintStream;

public class Main {

    public static void main(String[] args) {
        try (PrintStream ps = new PrintStream("output.txt")) {
            
            // Print various data types
            ps.print(true);
            ps.print(' ');
            ps.print(123);
            ps.print(' ');
            ps.print(3.14159);
            ps.println();
            
            // Println variants
            ps.println("This is a string");
            ps.println(new Object());
            
            System.out.println("Data written to output.txt");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

此示例显示了基本的 print 和 println 用法。 第一行打印多个值,没有换行符。 println 方法添加自动行终止符。 try-with-resources 确保正确的流关闭。

使用 printf 格式化输出

printf 方法提供 C 风格的格式化输出。 它使用带有说明符的格式字符串来控制输出。 这与 format 方法相同。 该方法返回 PrintStream 以进行方法链接。

Main.java
import java.io.PrintStream;
import java.util.Date;

public class Main {

    public static void main(String[] args) {
        try (PrintStream ps = new PrintStream("formatted.txt")) {
            
            // Basic formatting
            ps.printf("Integer: %d, Float: %.2f%n", 42, 3.14159);
            
            // Date formatting
            ps.printf("Current date: %tF %n", new Date());
            
            // Method chaining
            ps.printf("Name: %s %n", "John")
              .printf("Age: %d %n", 30);
            
            // Width and alignment
            ps.printf("|%-10s|%10s|%n", "Left", "Right");
            
            System.out.println("Formatted output written");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

此示例演示了 printf 格式化功能。 它显示了数字格式化、日期格式化、方法链接和文本对齐。 %n 说明符是平台独立的换行符。 格式字符串遵循与 String.format() 相同的规则。

使用 checkError 处理错误

PrintStream 不会抛出 IOExceptions。 而是设置一个内部错误标志。 checkError 方法返回此标志的状态。 设置后,该标志将保持设置状态,直到流关闭。

Main.java
import java.io.PrintStream;

public class Main {

    public static void main(String[] args) {
        // Create PrintStream that will fail on write
        PrintStream ps = new PrintStream(new java.io.OutputStream() {
            @Override
            public void write(int b) {
                // Simulate write failure
                throw new RuntimeException("Write failed");
            }
        });
        
        // Attempt to write
        ps.println("This will fail");
        
        // Check error status
        if (ps.checkError()) {
            System.out.println("Error occurred during writing");
        }
        
        // The error persists
        System.out.println("Error still set? " + ps.checkError());
        
        ps.close();
    }
}

此示例模拟了写入失败的情况。 自定义的 OutputStream 总是抛出一个异常。 在写入失败后,checkError 返回 true。 错误状态会持续存在,直到流关闭。 这演示了 PrintStream 的错误处理方法。

重定向 System.out

PrintStream 通常用于重定向标准输出。 System.setOut 方法接受 PrintStream。 这允许将控制台输出捕获到文件或其他目标。

Main.java
import java.io.PrintStream;
import java.io.File;

public class Main {

    public static void main(String[] args) {
        try {
            // Save original System.out
            PrintStream originalOut = System.out;
            
            // Redirect to file
            PrintStream fileOut = new PrintStream(new File("console.log"));
            System.setOut(fileOut);
            
            // These will go to file
            System.out.println("This goes to console.log");
            System.out.printf("Formatted: %d %n", 42);
            
            // Restore original System.out
            System.setOut(originalOut);
            System.out.println("Back to console output");
            
            fileOut.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

此示例显示了如何将 System.out 重定向到文件。 原始 PrintStream 被保存以进行恢复。 然后,所有 System.out 调用都写入该文件。 最后,恢复原始输出。 此技术对于日志记录很有用。

追加到文件

虽然 PrintStream 不直接支持追加,但您可以通过在追加模式下包装 FileOutputStream 来实现此目的。 这允许添加到现有文件,而无需覆盖。

Main.java
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.io.IOException;

public class Main {

    public static void main(String[] args) {
        try (FileOutputStream fos = new FileOutputStream("log.txt", true);
             PrintStream ps = new PrintStream(fos)) {
            
            ps.println("New log entry at " + System.currentTimeMillis());
            System.out.println("Appended to log.txt");
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

此示例演示了追加到文件。 使用启用的追加模式创建 FileOutputStream。 然后,PrintStream 写入此流。 每次运行都会添加新行,而不会覆盖现有内容。 时间戳确保唯一的条目。

来源

Java PrintStream 类文档

在本文中,我们介绍了 Java PrintStream 类的基本方法和特性。 了解这些概念对于在 Java 应用程序中使用格式化输出至关重要。

作者

我叫 Jan Bodnar,是一位经验丰富的专业程序员。我从 2007 年开始撰写编程文章,至今已创作了 1400 多篇文章和 8 本电子书。凭借超过 8 年的教学经验,我致力于分享我的知识,帮助他人掌握编程概念。

列出所有Java教程