在Java开发中,读取文档是一项常见且重要的任务,无论是处理配置文件、日志文件,还是解析用户上传的文档,都需要掌握正确的读取方法,Java提供了多种文档读取方式,涵盖文本文件、二进制文件乃至复杂的结构化文档格式,本文将系统介绍Java中读取文档的核心方法、适用场景及最佳实践,帮助开发者根据实际需求选择合适的技术方案。

文本文件的读取方法
文本文件是开发中最常处理的文档类型,Java提供了多种读取方式,每种方式在性能和适用场景上各有侧重。
使用BufferedReader逐行读取
BufferedReader是Java IO中高效的文本读取类,通过缓冲机制减少磁盘I/O操作,特别适合读取大文件,其核心方法readLine()可以按行读取内容,避免频繁的内存分配。
try (BufferedReader reader = new BufferedReader(new FileReader("example.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
这种方式的优点是内存占用低,适合处理GB级别的大文件,但需要手动处理资源关闭(通过try-with-resources语句自动管理)。
使用Scanner灵活解析
Scanner类提供了更丰富的解析功能,除了读取文本外,还能将内容解析为基本数据类型,通过设置分隔符,可以灵活处理不同格式的文本:
try (Scanner scanner = new Scanner(new File("data.txt"))) {
scanner.useDelimiter(","); // 设置分隔符
while (scanner.hasNext()) {
String token = scanner.next();
System.out.println(token);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Scanner适合处理结构化文本,但性能略低于BufferedReader,不适合处理超大文件。

使用Files类(NIO.2)
Java 7引入的NIO.2(New I/O)提供了Files工具类,简化了文件操作,其readAllLines()方法可以将文件内容一次性读取到内存,适合小文件快速处理:
try {
List<String> lines = Files.readAllLines(Paths.get("config.txt"), StandardCharsets.UTF_8);
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
该方法代码简洁,但会将整个文件加载到内存,大文件可能导致内存溢出。
二进制文件的读取方法
对于图片、视频、PDF等非文本文件,需要采用字节流(InputStream)进行读取。
基本字节流读取
FileInputStream是读取二进制文件的基础类,通过read()方法逐字节读取:
try (FileInputStream fis = new FileInputStream("image.jpg")) {
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fis.read(buffer)) != -1) {
// 处理读取的字节数据
}
} catch (IOException e) {
e.printStackTrace();
}
实际开发中通常结合BufferedInputStream提升性能,通过缓冲区减少磁盘访问次数。

使用Files.readAllBytes()
对于较小的二进制文件,NIO.2的Files.readAllBytes()方法提供了更简洁的读取方式:
try {
byte[] bytes = Files.readAllBytes(Paths.get("document.pdf"));
// 处理字节数组
} catch (IOException e) {
e.printStackTrace();
}
该方法直接返回字节数组,适合处理小文件,大文件仍需使用流式读取。
结构化文档的解析
现代应用常需处理JSON、XML等结构化文档,Java提供了多种解析库。
JSON文档解析
- Jackson:高性能JSON处理库,支持数据绑定、流式API等:
ObjectMapper mapper = new ObjectMapper(); try { User user = mapper.readValue(new File("user.json"), User.class); System.out.println(user.getName()); } catch (IOException e) { e.printStackTrace(); } - Gson:Google开发的JSON库,API简洁易用:
Gson gson = new Gson(); try (Reader reader = new FileReader("data.json")) { Map<String, Object> map = gson.fromJson(reader, Map.class); System.out.println(map); } catch (IOException e) { e.printStackTrace(); }
XML文档解析
- DOM解析:将XML文档加载到内存树形结构,适合小型文档:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new File("config.xml")); NodeList nodes = document.getElementsByTagName("user"); - SAX解析:事件驱动型解析器,内存占用低,适合大文件:
SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); DefaultHandler handler = new DefaultHandler() { @Override public void startElement(String uri, String localName, String qName, Attributes attributes) { // 解析元素开始事件 } }; saxParser.parse("data.xml", handler);
文档读取的最佳实践
- 资源管理:始终使用try-with-resources语句确保流、文件句柄等资源自动关闭,避免资源泄漏。
- 字符编码:读取文本文件时明确指定字符编码(如UTF-8),避免乱码问题:
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("file.txt"), "UTF-8")); - 异常处理:对可能发生的IO异常进行合理处理,避免程序崩溃。
- 性能优化:大文件采用缓冲流或分块读取,小文件可直接使用NIO.2的便捷方法。
- 内存安全:处理超大文件时,避免使用readAllLines()或readAllBytes()等方法,改用流式逐行/分块处理。
Java中读取文档的方法多种多样,开发者需根据文件类型、大小和业务需求选择合适的技术,文本文件优先考虑BufferedReader或NIO.2的Files类;二进制文件使用字节流并配合缓冲机制;JSON/XML等结构化文档则借助Jackson、Gson或DOM/SAX解析器,无论采用何种方式,遵循资源管理、异常处理和性能优化的最佳实践,才能构建稳定高效的文档处理逻辑,随着Java版本的更新,NIO.2等新特性不断简化文件操作,开发者应关注技术演进,选择更现代的解决方案。


















