讲师中心 微信公众号
AI工具推荐 视频效率加速

详解Java中的PrintWriter与PrintStream_格式化输出文本与日志记录

陌婷姑娘_6168

陌婷姑娘_6168

发布时间:2026-02-24 16:46:02

|

801人浏览过

|

来源于php中文网

原创

该选PrintWriter还是PrintStream取决于数据类型和场景:纯文本/日志用PrintWriter(支持指定编码、自动flush、异常不中断线程);二进制混合内容或兼容System.out时用PrintStream(需显式指定编码,注意平台默认编码陷阱),二者均非线程安全,多线程需加锁或改用专业日志框架。

详解java中的printwriter与printstream_格式化输出文本与日志记录

PrintWriter 和 PrintStream 什么时候该选哪个?

PrintWriter 是字符流,PrintStream 是字节流——这是最根本的分水岭。你写的是纯文本、日志、配置内容,用 PrintWriter;你要输出二进制混合内容(比如 HTTP 响应头 + 图片数据),或者必须兼容老代码里硬写的 System.out(它本身就是 PrintStream 实例),那就得用 PrintStream。

  • PrintWriter 支持指定字符编码(如 new PrintWriter(file, "UTF-8")),PrintStream 构造时只能传 File 或 OutputStream,编码靠底层 OutputStreamWriter 隐式处理,容易踩默认平台编码坑
  • PrintWriter 的 printf()、format() 方法抛出的是未检查异常(RuntimeException),PrintStream 同名方法也是,但它的 write() 系列方法可能触发 IOException,而 PrintWriter 默认吞掉异常(除非你显式调用 checkError())
  • 日志记录场景下,PrintWriter 更安全:能控制编码、不意外中断线程(因异常被吞)、支持自动 flush(autoFlush = true)

PrintWriter.printf() 不生效?检查这三件事

printf() 看似调用了,文件却空着或内容不全——不是语法错,是流没刷出去。

  • 没开自动 flush:new PrintWriter(out, true) 第二个参数必须为 true,否则换行符不会触发刷盘;只靠 println() 不够,printf() 不带换行
  • 输出目标是文件但没 close:flush() 不等于 close(),尤其用 try-with-resources 时,别漏掉 close() 触发的最终 flush
  • 编码不匹配导致乱码掩盖内容:比如用 GBK 打开 UTF-8 写入的文件,看着像“没输出”,其实是字节解码失败

示例:

try (PrintWriter pw = new PrintWriter("log.txt", "UTF-8")) {
    pw.printf("User %s logged in at %tF%n", username, System.currentTimeMillis());
    // 这里没 println(),也没 flush(),且 autoFlush=false → 内容卡在缓冲区
}

PrintStream.println() 为什么有时中文变问号?

根本原因是 PrintStream 底层用的是平台默认编码(Windows 是 GBK,Linux/macOS 通常是 UTF-8),而你写入的字符串是 UTF-16(Java 字符串内部格式),转换时若没显式指定,就按系统猜。

立即学习“Java免费学习笔记(深入)”;

  • 直接传 File 构造:new PrintStream("a.txt") → 完全依赖系统编码,跨平台必出问题
  • 正确做法是包装 FileOutputStream + OutputStreamWriter,但那就绕过 PrintStream 了;更实际的解法是改用 PrintWriter,它构造函数明确支持编码字符串
  • 如果非用 PrintStream(比如要重定向 System.out),必须用 new PrintStream(new FileOutputStream(f), true, "UTF-8"),第三个参数才是编码名

日志记录别直接用 PrintWriter/PrintStream 做并发写入

它们都不是线程安全的写操作类。多个线程同时调 println(),可能一行日志被截断、两行粘连、甚至抛 NullPointerException(因内部 lock 字段未初始化)。

  • 单线程写文件没问题;多线程必须加锁,或用 java.util.logging.Logger、slf4j + logback 这类专为并发设计的日志框架
  • 即使加了 synchronized,PrintWriter 的 checkError() 也不反映其他线程的错误状态,错误检测失效
  • 小项目图快用 PrintWriter 记日志可以,但只要涉及定时任务、Web 请求、异步回调,就得切到真正线程安全的日志方案

字符编码、自动刷盘、线程安全——这三个点漏掉任何一个,都会让看似简单的输出变成深夜排查现场。

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3031

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

554

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

522

2026.02.12

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1749

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1211

2024.06.27

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

808

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1029

2023.11.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1758

2023.08.03

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn