Java如何读取文件内容
- 后端开发
- 2025-07-06
- 2448
在Java中读取文档内容可使用多种方式:通过
FileReader
和
BufferedReader
逐行读取文本;利用
Files.readAllLines()
一次性加载所有行到集合;或用
Files.readString()
(JDK11+)直接读取为字符串,二进制文件则推荐
FileInputStream
或
Files.readAllBytes()
。
在Java中读取文档内容是常见的文件操作任务,适用于日志分析、数据导入或配置文件处理等场景,以下是几种高效可靠的方法,每种方法均附代码示例和适用场景分析,确保代码健壮性(使用try-with-resources
自动关闭资源,避免内存泄漏)。
使用 BufferedReader
+ FileReader
(经典文本读取)
适用场景:逐行读取文本文件(如.txt
, .csv
),适合大文件处理。
优势:内存占用低,通过缓冲区提升读取效率。
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class ReadFileExample { public static void main(String[] args) { String filePath = "example.txt"; // 文件路径 try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); // 处理每一行内容 } } catch (IOException e) { System.err.println("读取文件失败: " + e.getMessage()); } } }
使用 Files
类(Java 7+ 推荐)
适用场景:快速读取小文本文件(如配置文件)。
优势:代码简洁,一行完成读取,但会一次性加载整个文件到内存。
import java.nio.file.Files; import java.nio.file.Paths; import java.io.IOException; import java.util.List; public class ReadFileExample { public static void main(String[] args) { String filePath = "example.txt"; try { // 读取所有行到List List<String> lines = Files.readAllLines(Paths.get(filePath)); for (String line : lines) { System.out.println(line); } // 或直接读取为字符串 String content = new String(Files.readAllBytes(Paths.get(filePath))); System.out.println(content); } catch (IOException e) { System.err.println("文件读取异常: " + e.getMessage()); } } }
使用 Scanner
(灵活解析文本)
适用场景:需按分隔符(如空格、逗号)解析内容(如结构化数据)。
优势:支持正则表达式分割,灵活处理复杂格式。
import java.io.File; import java.io.IOException; import java.util.Scanner; public class ReadFileExample { public static void main(String[] args) { File file = new File("example.txt"); try (Scanner scanner = new Scanner(file)) { scanner.useDelimiter(","); // 设置分隔符(例如CSV文件) while (scanner.hasNext()) { String token = scanner.next(); System.out.println(token); // 处理每个字段 } } catch (IOException e) { System.err.println("文件解析错误: " + e.getMessage()); } } }
使用 FileInputStream
(二进制文件读取)
适用场景:非文本文件(如图片、PDF、视频)。
优势:直接操作字节流,保留原始数据。
import java.io.FileInputStream; import java.io.IOException; public class ReadFileExample { public static void main(String[] args) { String filePath = "image.png"; try (FileInputStream inputStream = new FileInputStream(filePath)) { byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { // 处理字节数据(例如保存或转码) processBytes(buffer, bytesRead); } } catch (IOException e) { System.err.println("二进制文件读取失败: " + e.getMessage()); } } private static void processBytes(byte[] buffer, int length) { // 自定义处理逻辑(如写入到其他流) } }
关键注意事项
-
文件编码:
文本文件需注意编码格式(如UTF-8),若出现乱码,指定编码:BufferedReader reader = new BufferedReader( new InputStreamReader(new FileInputStream(filePath), StandardCharsets.UTF_8) );
-
大文件处理:
避免Files.readAllLines()
,改用BufferedReader
逐行读取,防止内存溢出。 -
异常处理:
务必捕获IOException
,记录错误信息或回退操作。 -
资源释放:
使用 try-with-resources(如try (BufferedReader reader = ...)
)确保资源自动关闭,防止文件句柄泄漏。
方法 | 适用场景 | 内存占用 | 性能 |
---|---|---|---|
BufferedReader |
大文本文件逐行处理 | 低 | 高 |
Files 类 |
小文本文件 | 高 | 快 |
Scanner |
结构化文本解析 | 中 | 中 |
FileInputStream |
二进制文件 | 低 | 高 |
提示:根据需求选择方法,优先使用
Files
类简化代码,大文件场景用BufferedReader
,二进制数据用FileInputStream
。
权威引用说明
- Java官方文件I/O文档:Oracle Java Files
try-with-resources
语法规范:Java SE 7 try-with-resources- 字符编码处理指南:Unicode in Java
通过以上方法,您可安全高效地处理各类文档,遇到复杂场景时,建议结合Apache Commons IO或Guava等库简化代码(如FileUtils.readFileToString
)。