java读写文档

admin 106 0
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&lt;String&gt; hobbies;
// 省略getter/setter

public 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

标签: #读写 #文档