Java读写文档涵盖文本、Excel、PDF等多种类型,核心依赖I/O流与第三方库,文本文件可通过字节流(FileInputStream/OutputStream)或字符流(FileReader/Writer)处理,结合缓冲流(Buffered)提升效率;结构化文档如Excel常用Apache POI库,支持单元格操作与格式设置;PDF文档则借助iText或PDFBox实现内容读写,NIO(New I/O)通过通道(Channel)和缓冲区(Buffer)优化大文件性能,这些技术广泛应用于数据导入导出、日志处理、报表生成等场景,需根据文档类型选择合适方案,确保读写高效与数据安全。
Java文档读写:从基础到实践的应用指南
在Java开发中,文档读写是贯穿项目全流程的核心能力,无论是配置文件解析、日志数据持久化、业务报表生成,还是用户数据存储,都离不开对文档的高效操作,本文将系统梳理Java中主流文档格式的读写方案,涵盖文本文件、JSON、XML、Excel及Word文档,结合实战代码与最佳实践,帮助开发者掌握不同场景下的文档处理技巧。
基础文本文件读写:IO流与NIO.2双路径
文本文件(如.txt、.csv等)是数据存储的基石,Java通过`java.io`包的流体系实现传统读写,而Java 7+引入的NIO.2(`java.nio.file`)则提供了更现代的解决方案,核心原则明确:输入流(InputStream/Reader)负责读取,输出流(OutputStream/Writer)负责写入,合理使用缓冲流(Buffered)可显著提升I/O性能。
字符流 vs 字节流:场景化选择
- 字符流(Reader/Writer):以字符为处理单位,专为文本设计,支持指定编码(如UTF-8),自动处理字符集转换,彻底解决乱码问题。
核心类:`FileReader`/`FileWriter`(基础文件操作)、`BufferedReader`/`BufferedWriter`(缓冲读写)、`InputStreamReader`/`OutputStreamWriter`(字节流转字符流)
- 字节流(InputStream/OutputStream):以字节为处理单位,适用于二进制文件(图片、音视频等),处理文本时需手动编码转换,灵活性较低。
实战:高效文本读写与异常处理
以下代码展示使用缓冲流读写UTF-8文本文件,并实现文件追加模式:
import java.io.*; import java.nio.charset.StandardCharsets;public class TextFileDemo { private static final String FILE_PATH = "data.txt";
public static void main(String[] args) { // 写入文件(追加模式) writeToFile("\n新追加的内容:Java NIO.2实践"); // 读取文件 readFromFile(); } private static void writeToFile(String content) { try (BufferedWriter writer = new BufferedWriter( new FileWriter(FILE_PATH, true, StandardCharsets.UTF_8))) { writer.write(content); System.out.println("✅ 文件写入成功!"); } catch (IOException e) { System.err.println("❌ 写入失败:" + e.getMessage()); } } private static void readFromFile() { try (BufferedReader reader = new BufferedReader( new FileReader(FILE_PATH, StandardCharsets.UTF_8))) { System.out.println("\n📄 文件内容:"); reader.lines().forEach(System.out::println); // Java 8 Stream API优化 } catch (IOException e) { System.err.println("❌ 读取失败:" + e.getMessage()); } }关键优化点:
- 显式指定UTF-8编码,避免平台默认编码差异
- 使用`try-with-resources`确保资源自动释放
- 通过`FileWriter`的`append`参数实现文件追加
- 采用`Stream API`简化行遍历代码
结构化数据读写:JSON与XML的生态实践
现代应用中,结构化数据(配置信息、API响应等)多采用JSON或XML格式,Java提供了丰富的工具链简化操作。
JSON文档处理:Jackson生态深度实践
JSON凭借轻量级、易解析的特性成为数据交换主流,推荐使用Jackson库(高性能、功能全面),核心API通过`ObjectMapper`实现对象序列化/反序列化。
依赖配置(Maven)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
高级读写示例
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.annotation.JsonProperty; import java.io.File; import java.util.*;// 自定义对象映射 class User { @JsonProperty("user_name") private String name;
private int age; private List<String> hobbies; // 省略getter/setterpublic class JsonAdvancedDemo { public static void main(String[] args) { ObjectMapper mapper = new ObjectMapper(); String filePath = "user.json";
// 写入JSON(对象→文件) User user = new User(); user.setName("李四"); user.setAge(30); user.setHobbies(Arrays.asList("摄影", "旅行")); try { mapper.writerWithDefaultPrettyPrinter() // 美化输出 .writeValue(new File(filePath), user); System.out.println("✅ JSON对象写入成功!"); } catch (IOException e) { System.err.println("❌ 写入失败:" + e.getMessage()); } // 读取JSON(文件→对象) try { User readUser = mapper.readValue(new File(filePath), User.class); System.out.println("\n📋 读取的User对象:" + readUser.getName()); } catch (IOException e) { System.err.println("❌ 读取失败:" + e.getMessage()); } }核心技巧:
- 使用`@JsonProperty`注解解决字段名映射问题
- `writerWithDefaultPrettyPrinter()`生成格式化JSON
- 支持复杂对象(嵌套对象、集合)的自动转换
XML文档处理:DOM与SAX的权衡
XML在配置文件(如Spring XML)和传统企业系统中广泛应用,Java标准库提供两种解析方式:
- DOM(Document Object Model):将XML加载为内存树状结构,适合小型文件,支持随机访问
- SAX(Simple API for XML):事件驱动解析,内存占用低,适合大文件,但只能顺序读取
DOM解析实战
import org.w3c.dom.*; import javax.xml.parsers.*; import java.io.File;public class XmlDomDemo { public static void main(String[] args) { String filePath = "config.xml"; try { // 1. 创建解析器 DocumentBuilderFactory