Java 7+ 推荐使用 Path 而非 File,因 Path 不可变、支持符号链接与 Unicode 路径,配合 Files 类更安全自然;File 易因转义、编码、UNC 路径等静默失败。

Java 7+ 推荐用 java.nio.file.Path 而不是 java.io.File
因为 Path 是不可变的、支持符号链接解析、能更好处理 Unicode 路径,且与 Files 工具类配合更自然。而 File 在遇到空格、非 ASCII 字符或 UNC 路径时容易静默失败或抛出 MalformedURLException。
常见错误现象:new File("C:\temp\log.txt") 在 Windows 下因反斜杠被当转义字符导致路径错乱;file.exists() 返回 false 却没报错,实际是路径构造失败。
- 用
Paths.get("C:\\temp\\log.txt")或Paths.get("C:/temp/log.txt")(正斜杠在所有平台都安全) - 拼接路径统一用
path.resolve("subdir").resolve("file.txt"),别用字符串拼+ - 获取绝对路径:用
path.toAbsolutePath().normalize(),normalize()会去掉..和.
Files 类覆盖 90% 文件操作需求
Files 是 Path 的配套工具类,所有方法都以 Path 为参数,不操作流也不缓存状态,适合函数式写法。
典型使用场景:复制配置模板、读取小配置文件、创建临时目录、检查文件是否可执行。
立即学习“Java免费学习笔记(深入)”;
LANUX V1.0 蓝脑商务网站系统 适用于网店、公司宣传自己的品牌和产品。 系统在代码、页面方面设计简约,浏览和后台管理操作效率高。 此版本带可见即可得的html编辑器, 方便直观添加和编辑要发布的内容。 安装: 1.解压后,更换logo、分类名称、幻灯片的图片及名称和链接、联系我们等等页面。 2.将dbconfig.php里面的数据库配置更改为你的mysql数据库配置 3.将整个文件夹上传至
- 读取文本文件:用
Files.readString(path, StandardCharsets.UTF_8)(Java 11+),比Files.readAllLines()更简洁,自动关闭资源 - 写入文件:用
Files.writeString(path, content, StandardCharsets.UTF_8, CREATE, WRITE, TRUNCATE_EXISTING) - 递归删除:直接
Files.walkFileTree(path, new SimpleFileVisitor,别自己写递归调() { ... }) delete() - 原子写入:先写到
path.resolveSibling(path.getFileName() + ".tmp"),再用Files.move(tmp, path, REPLACE_EXISTING)
第三方库只在 Files 不够用时才引入
Apache Commons IO 和 Guava 的 Files 工具类曾很流行,但现在 Java 原生 Files 已覆盖大部分场景。引入它们的主要理由只剩两个:需要兼容 Java 7/8,或要高级功能如校验和、行过滤、大文件分块读取。
容易踩的坑:FileUtils.copyDirectory() 默认不保留最后修改时间,而 Files.copy(src, dst, COPY_ATTRIBUTES) 可选保留;FileUtils.readFileToString() 默认用系统编码,易乱码,原生 readString() 强制指定 charset。
- 如果项目已用 Java 11+,优先用
Files—— 没有额外依赖、无版本冲突风险 - 若需监听文件变化,用
WatchService(基于 OS 原生 inotify/kqueue),别轮询lastModified() - 处理超大文件(>1GB)时,避免
readString()或readAllBytes(),改用Files.lines()流式处理或Files.newInputStream()配合缓冲区
Windows 路径和权限问题最常卡住人
Java 的 Path 虽屏蔽了部分平台差异,但 Windows 下的权限模型(ACL)、长路径限制(\\?\ 前缀)、驱动器根目录访问仍需手动适配。
错误现象:Files.createDirectories(path) 在 C:\Program Files\myapp 下抛 AccessDeniedException;path.toRealPath() 在符号链接后返回空指针;路径长度超 260 字符直接失败。
- 启用长路径支持:Windows 10+ 需开启组策略「启用 Win32 长路径」,代码中仍建议用
Paths.get("\\\\?\\C:\\very\\long\\path")构造 - 检查权限:用
Files.isReadable(path)、Files.isWritable(path),而非依赖异常捕获 - 避免硬编码驱动器盘符:用
Paths.get(System.getProperty("user.home"), "config")替代"C:\\Users\\xxx\\config"
Files 方法里——每次调用前想清楚:它会不会读磁盘?会不会阻塞?有没有权限?有没有并发风险?









