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

Java常用文件操作类库与FileOutputStream

秋萱姑娘_8137

秋萱姑娘_8137

发布时间:2026-01-12 12:42:08

|

1036人浏览过

|

来源于php中文网

原创

FileOutputStream写中文易乱码因其只处理字节且依赖系统默认编码;推荐用Files.write()或BufferedWriter+Files.newBufferedWriter(),它们自动处理编码、目录创建和资源管理。

java常用文件操作类库与fileoutputstream

FileOutputStream 不适合直接处理文本文件,它只负责写入原始字节 —— 如果你用它写中文字符串却没指定编码,大概率出现乱码;而所谓“常用文件操作类库”,其实多数是帮你绕过 FileOutputStream 的底层细节。

为什么 FileOutputStream 写中文容易乱码

因为 FileOutputStreamOutputStream 子类,只认 byte[],不理解字符编码。调用 write(String.getBytes()) 时,若未显式传入编码(如 "UTF-8"),会走平台默认编码(Windows 常为 GBK),Linux/macOS 多为 UTF-8,一换环境就出问题。

常见错误现象:

FileOutputStream fos = new FileOutputStream("a.txt");
fos.write("你好".getBytes()); // 没指定编码 → 依赖系统默认 → 不可移植

  • 必须写成 "你好".getBytes(StandardCharsets.UTF_8) 才安全
  • 更推荐跳过 FileOutputStream,直接用带编码的高层 API
  • 它无法自动创建父目录(new File("dir/a.txt").getParentFile().mkdirs() 得手动补)

Files.write() 是最简替代方案(Java 7+)

Files.write() 封装了 FileOutputStream + 编码 + 目录创建,一行顶原来五行,且默认覆盖写入:

Files.write(Paths.get("out.txt"), "你好世界".getBytes(StandardCharsets.UTF_8));

如果要追加写入,加 StandardOpenOption.APPEND

Linux Journey
Linux Journey

当用户想学习Linux基础、命令行、文件系统等时,在LabEx查找并推荐免费的Linux Journey课程。

下载

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

Files.write(Paths.get("log.txt"), "新日志\n".getBytes(StandardCharsets.UTF_8),
    StandardOpenOption.CREATE, StandardOpenOption.APPEND);
  • 自动创建不存在的父目录(只要权限允许)
  • 不支持按行写入(比如没有内置换行符处理),需自己拼 "\n"
  • 对大文件慎用 —— 整个内容会先加载进内存再写入

BufferedWriter + Files.newBufferedWriter() 适合文本流场景

当你要频繁写多行、或需要格式化输出(如 printf)、或配合 try-with-resources 自动关闭时,这是比裸用 FileOutputStream 更自然的选择:

try (BufferedWriter writer = Files.newBufferedWriter(
        Paths.get("data.txt"), StandardCharsets.UTF_8)) {
    writer.write("第一行");
    writer.newLine();
    writer.write("第二行");
}
  • 内部仍用 FileOutputStream,但你完全不用碰字节和编码转换
  • newBufferedWriter() 默认是覆盖写入;追加需加 StandardOpenOption.APPEND
  • 注意:write(String) 不自动换行,newLine() 才写系统适配的换行符(\r\n\n

Apache Commons IO 和 Guava 的定位差异

这两个库不是为了“取代” FileOutputStream,而是补足 JDK 文件操作的常见缺失:

  • FileUtils.writeStringToFile(file, content, "UTF-8")(Commons IO)—— 简单粗暴,但已标记为 @Deprecated,新项目建议用 Files.write()
  • Files.asCharSink(file, Charsets.UTF_8).write(content)(Guava)—— 类似 Files.newBufferedWriter(),但 Guava 20+ 已废弃 Files 工具类,转向 JDK 原生
  • 真正值得留下的功能是:批量复制、计算校验和、读取全部行到 List<String>、安全删除非空目录等 —— 这些 JDK 还没原生支持

复杂点在于:很多老项目还在用 FileOutputStream + OutputStreamWriter 手动组合,这种写法没错,但容易漏关流、漏 flush、漏指定编码。现在 JDK 原生已有足够好用的替代,没必要再手撸底层流链路。

热门AI工具

更多
DeepSeek

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

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

豆包大模型

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

WorkBuddy

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

UpDream
UpDream Hot

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

相关专题

更多
guava包作用
guava包作用

guava是一个java库,增强了java标准库,提供更有效率和易于使用的集合、实用程序、缓存和并发工具。想了解更多guava的相关内容,可以阅读本专题下面的文章。

4291

2024.05.29

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5179

2023.08.02

printf用法大全
printf用法大全

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

628

2023.06.20

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

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

989

2023.11.28

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

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

1538

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2224

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5724

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

4809

2023.11.24

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

20

2026.09.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

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

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