【Java】打印流详解

大家好,最近一直在梳理 Java IO 流相关知识点,前面和大家分享了字节流、字符流的基础内容,今天我们继续来讲 IO 体系里使用频率极高的打印流。在日常代码调试、简单日志输出、控制台打印场景中,打印流几乎无处不在,掌握它能让我们的输出操作变得更加简洁高效。

一、打印流概述

Java 专门提供了两类打印流:PrintStreamPrintWriter

二者归属不同流体系:

  • PrintStream字节打印流,继承自 OutputStream,属于字节流;
  • PrintWriter字符打印流,继承自 Writer,属于字符流。

这也是区分两者使用场景的核心依据,处理纯文本优先用字符流,处理字节数据则选择字节打印流。

二、打印流核心特点

相比于普通的字节流、字符流,打印流有三大突出优势,也是它被广泛使用的原因:

  1. 自动类型转换:支持八大基本数据类型、对象、字符串等所有数据类型,底层自动转为字符串输出,不用手动拼接转换;
  2. 自带换行能力:提供专门的换行方法,简化格式排版;
  3. 输出目标灵活:既可以输出到控制台,也能直接输出到文件、网络流等目标节点,兼顾调试和文件写入场景。

补充说明:生产正式项目中不建议用打印流做日志记录,主流会使用 Logback、SLF4J 等专业日志框架,打印流更多用于本地调试、简单脚本输出。

三、PrintStream 字节打印流实战

1. 常用基础方法

PrintStream 最常用的三类方法:

  • print():原样输出内容,不换行
  • println():输出内容后自动换行,是我们控制台最常用的方法;
  • printf()格式化输出,支持自定义格式,功能强大。

我们先写基础示例,演示不同数据类型的输出:

import java.io.PrintStream;

public class PrintStreamDemo {
    public static void main(String[] args) {
        // System.out 本质就是 PrintStream 对象,默认输出到控制台
        PrintStream ps = System.out;

        // 输出不同数据类型
        ps.print(100);        // 整数,不换行
        ps.print(" | ");
        ps.print(3.14);       // 浮点数
        ps.print(" | ");
        ps.print(true);       // 布尔值

        ps.println();         // 单纯换行
        ps.println('A');      // 字符 + 自动换行
        ps.println("Java打印流"); // 字符串
    }
}

运行结果:

100 | 3.14 | true
A
Java打印流

2. printf 格式化输出(重点)

printf 是格式化输出的核心方法,方法签名如下:

public PrintStream printf(String format, Object... args)
  • format:格式字符串,由普通字符转换说明符组成;
  • args:待输出的参数列表,和格式符一一对应。

常用转换说明符

格式符作用
%s输出字符串
%d / %i输出十进制整数
%f输出浮点数
%c输出单个字符
%b输出布尔值
%x / %X输出十六进制数(小写 / 大写)
%n平台通用换行符

格式修饰符

除基础格式符外,还可以搭配修饰符控制宽度、精度、对齐

  1. 宽度:指定输出最小占位宽度,不足则补空格;
  2. 精度:浮点数指定小数位数,字符串指定截取长度;
  3. 对齐- 左对齐,默认右对齐。

格式化代码示例:

public class PrintfDemo {
    public static void main(String[] args) {
        String name = "云扬";
        int age = 24;
        double score = 95.678;

        // 基础格式化
        System.out.printf("姓名:%s,年龄:%d%n", name, age);
        // 浮点数保留2位小数
        System.out.printf("分数:%.2f%n", score);
        // 设置宽度、左对齐
        System.out.printf("成绩(左对齐,占10位):%-10.2f | 原始值:%f%n", score, score);
        // 设置宽度、右对齐
        System.out.printf("成绩(右对齐,占10位):%10.2f | 原始值:%f%n", score, score);
        // 十六进制输出
        int num = 255;
        System.out.printf("十进制%d = 十六进制小写%x = 大写%X%n", num, num, num);
    }
}

运行结果:

姓名:云扬,年龄:24
分数:95.68
成绩(左对齐,占10位):95.68      | 原始值:95.678000
成绩(右对齐,占10位):     95.68 | 原始值:95.678000
十进制255 = 十六进制小写ff = 大写FF

3. 输出内容到文件

PrintStream 不仅能输出控制台,也可以绑定文件流,把内容写入本地文件:

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

public class PrintStreamToFile {
    public static void main(String[] args) {
        try (
            // 绑定文件输出流,创建打印流
            FileOutputStream fos = new FileOutputStream("print.txt");
            PrintStream ps = new PrintStream(fos)
        ) {
            // 内容写入文件
            ps.println("Java 打印流写入文件");
            ps.printf("数字:%d,小数:%.1f%n", 666, 8.8);
            System.out.println("写入完成!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行后项目根目录会生成 print.txt,内容即为代码中输出的文本。

四、PrintWriter 字符打印流

PrintWriter 属于字符打印流,用法和 PrintStream几乎完全一致,同样拥有 print()println()printf() 方法。

字符流的优势:处理中文、纯文本时不会出现乱码,也是文本输出场景下的首选。

基础使用示例(控制台 + 文件输出):

import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.IOException;

public class PrintWriterDemo {
    public static void main(String[] args) {
        // 1. 控制台输出
        PrintWriter pw1 = new PrintWriter(System.out);
        pw1.println("PrintWriter 字符打印流");
        pw1.printf("字符:%c,布尔值:%b%n", 'Z', false);
        pw1.flush(); // 字符流建议手动刷新缓冲区

        // 2. 写入文件
        try (PrintWriter pw2 = new PrintWriter(new FileWriter("writer.txt"))) {
            pw2.println("字符流写入中文测试");
            pw2.println("Java IO 流系列文章");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

小提示:字符流带有缓冲区,输出完成后建议调用 flush() 刷新,保证数据立刻写出;使用 try-with-resources 语法会自动关闭流并刷新。

五、总结

  1. 打印流分为 PrintStream(字节)和 PrintWriter(字符),文本操作优先选择 PrintWriter
  2. 核心方法 print/println/printf 全覆盖常规输出场景,printf 是格式化输出的利器;
  3. 二者都可以绑定控制台、文件等输出源,适配调试、文件写入等场景;
  4. 定位区分:本地调试、简单输出用打印流,线上项目日志务必使用专业日志框架。

到这里,Java 打印流的核心知识点和实战用法就讲解完了。结合前面的字节流、字符流内容,整个 IO 基础体系就更加完整了。后续我会继续更新 Java IO 相关的进阶内容,大家可以持续关注~

Tags:

发表回复

Your email address will not be published. Required fields are marked *.

*
*