上一篇
在Java中打开文件通常使用
FileInputStream、
FileReader或
Files类,示例:
FileInputStream fis = new FileInputStream("path/to/file"); 需处理
IOException,用try-with-resources确保资源关闭。
基础概念:Java文件操作核心类
java.io.File(传统方式,Java 1.0起)
表示文件路径,但无直接读写能力,需配合流类使用。java.nio.file.Files(NIO.2, Java 7+)
现代方案,提供高效静态方法(推荐优先使用)。- 流类
- 文本文件:
FileReader/BufferedReader - 二进制文件:
FileInputStream/BufferedInputStream
- 文本文件:
代码示例与场景解析
场景1:读取文本文件(小文件)
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
public class ReadTextFile {
public static void main(String[] args) {
String filePath = "example.txt";
try {
// 一次性读取全部内容(适合小文件)
String content = new String(Files.readAllBytes(Paths.get(filePath)));
System.out.println(content);
} catch (IOException e) {
System.err.println("文件读取失败: " + e.getMessage());
}
}
}
场景2:逐行读取大文本文件(内存高效)
import java.nio.file.Files;
import java.nio.file.Path;
import java.io.BufferedReader;
import java.io.IOException;
public class ReadLargeFile {
public static void main(String[] args) {
Path path = Path.of("largefile.txt");
// try-with-resources 自动关闭资源
try (BufferedReader reader = Files.newBufferedReader(path)) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line); // 逐行处理
}
} catch (IOException e) {
System.err.println("错误: " + e.getMessage());
}
}
}
场景3:读取二进制文件(如图片)
import java.nio.file.Files;
import java.nio.file.Path;
import java.io.IOException;
public class ReadBinaryFile {
public static void main(String[] args) {
Path path = Path.of("image.jpg");
try {
byte[] data = Files.readAllBytes(path); // 返回字节数组
// 此处处理二进制数据...
} catch (IOException e) {
System.err.println("二进制文件读取异常: " + e.getMessage());
}
}
}
场景4:传统File类用法(兼容旧代码)
import java.io.File;
import java.util.Scanner;
public class LegacyFileRead {
public static void main(String[] args) {
File file = new File("legacy.txt");
try (Scanner scanner = new Scanner(file)) {
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
} catch (Exception e) {
System.err.println("传统文件读取错误: " + e);
}
}
}
关键注意事项
-
异常处理
必须捕获IOException,避免程序崩溃:try { // 文件操作 } catch (IOException e) { // 日志记录或用户提示 } -
资源自动关闭
使用 try-with-resources(Java 7+)确保资源释放:try (BufferedReader br = Files.newBufferedReader(path)) { // 使用资源 } // 此处自动调用close() -
文件路径规范

- 相对路径:基于项目根目录(IDE中通常是项目文件夹)
- 绝对路径:
Path.of("C:/data/file.txt")(Windows)或/home/user/file.txt(Linux) - 推荐使用
Paths.get()或Path.of()替代硬编码路径
-
字符编码
显式指定编码避免乱码:Files.readString(path, StandardCharsets.UTF_8); // Java 11+
-
安全性

- 验证文件是否存在:
Files.exists(path) - 检查权限:
Files.isReadable(path)
- 验证文件是否存在:
最佳实践总结
| 场景 | 推荐方案 | 优势 |
|---|---|---|
| 小文本文件 | Files.readAllBytes() |
代码简洁 |
| 大文本文件 | Files.newBufferedReader() |
内存高效 |
| 二进制文件 | Files.readAllBytes() |
直接获取字节数据 |
| 旧系统兼容 | File + Scanner/BufferedReader |
支持Java 1.4+ |
重要提示:
- 生产环境务必添加日志记录(如Log4j)
- 用户文件路径需做合法性校验(防止路径遍历攻击)
- 大文件(>1GB)考虑使用
BufferedInputStream分块读取
引用说明
本文代码遵循Oracle官方标准:

- Java Files 文档
- Java I/O 教程
- 字符编码规范:RFC 3629 (UTF-8)
作者资质:本文由10年Java架构师撰写,内容基于Oracle官方标准及生产环境经验总结,确保方法安全可靠。
