Java Path 与 File 的区别

2025 年 3 月 26 日 | 阅读 5 分钟

在 Java 中,PathFile 都是类。它们属于不同的包,但执行相同的机制。我们可以说 Java Path 类File 类的进阶版本。我们使用这两个类进行文件 I/O 操作。在本节中,我们将学习 Path 和 File 之间的区别

Java File 类

Java 中,File 是属于 java.io 包的类。它是文件和目录路径名的抽象表示。它用于文件 I/O,但有很多缺点。

Java Path 类

它与 File 类相同,或者我们可以说它是 Java File 类的替代类。它可以执行 File 类可以完成的所有操作。Java Path 类属于 java.nio.file 包。它是现代 java.nio.file 库的一部分。通常用于创建新项目。

Path vs File

Java SE 1.7 版本之前,我们使用 java.io.File 类进行文件 I/O。但是 File 类有几个缺点。File 类的许多方法都不会抛出异常,即使它们未能产生预期的输出。因此,很难获得有用的错误消息。

假设,要删除一个文件,而实现文件删除功能的程序未能删除该文件。程序显示“删除失败”的消息。但它无法识别失败的原因。文件删除失败的原因可能是文件不存在、文件路径错误、用户没有权限或有其他原因。

另一个缺点是 Java File 类不支持符号链接(也称为 symlink 或 soft link),并且 rename() 方法在不同平台上的工作方式不一致。在文件 I/O 中,我们需要对元数据提供更多支持,而 File 类在这方面表现不佳。元数据可能包括权限、文件所有者和安全属性。

File 类的方法无法扩展。请求大量目录列表可能会导致服务器挂起。它还可能导致内存资源问题,从而导致 DoS(拒绝服务)。

因此,Java File 类存在许多缺点,在新项目开发中没有理由使用该类。

Oracle 建议,如果我们有使用 java.io.File 类的旧代码,则使用 Path 类。它可以在对代码影响最小的情况下提供 Path 类的优势。

Java File 类提供了 toPath() 方法,用于将旧式文件转换为 java.nio.file.Path 实例。例如

它提供了 Java Path 类中可用且丰富的高级功能。假设我们要删除一个文件

我们可以通过使用 Files 类的 delete() 方法来修改上述语句,如下所示

当我们比较这两个类时,我们发现 java.nio.file.Path 优于 java.io.File 类。

Java Path 类更好,但 java.io.File 类在新版本中并未被弃用。Android 框架仍然使用 File 类进行基本的文件处理功能。

映射 java.io.File 功能到 java.nio.file.Path

在 Java SE 1.7 版本中,文件 I/O 架构已完全重新设计。我们不能用一个方法替换另一个方法。如果您正在开发与文件 I/O 相关的新项目,并希望使用 java.nio.file 包提供的丰富功能,请使用 File 类的 toPath() 方法。使用 Path 类的功能是可以的,但如果您不满意并且它不能满足您的需求,您应该重写文件 I/O 代码。

下表总结了 java.io.File API 中的哪些功能映射到 java.nio.file API。

java.io.File 功能java.nio.file 功能用途
java.io.Filejava.nio.file.Path它用于指定包。
java.io.RandomAccessFileSeekableByteChannel 功能。如果我们要随机访问文件,则使用它。
File.canRead, canWrite, canExecuteFiles.isReadable, Files.isWritable, and Files.isExecutable。
在 UNIX 文件系统上,元数据管理(文件和文件存储属性)包用于检查九种文件权限。
它用于检查授予文件的权限。
File.isDirectory(), File.isFile(), and File.length()Files.isDirectory(Path, LinkOption...), Files.isRegularFile(Path, LinkOption...), and Files.size(Path)它用于检索文件的元数据。
File.lastModified() and File.setLastModified(long)Files.getLastModifiedTime(Path, LinkOption...) and Files.setLastMOdifiedTime(Path, FileTime)
File 类设置各种属性的方法:setExecutable, setReadable, setReadOnly, setWritable这些方法被 Files 方法 setAttribute(Path, String, Object, LinkOption...) 替换。
new File(parent, "newfile")parent.resolve("newfile")它执行路径操作。
File.renameToFiles.move它用于将文件移动到目录。
File.deleteFiles.delete它用于删除文件或目录。
File.createNewFileFiles.createFile它用于创建新文件。
File.deleteOnExit被 createFile 方法中指定的 DELETE_ON_CLOSE 选项替换。
File.createTempFileFiles.createTempFile(Path, String, FileAttributes<?>), Files.createTempFile(Path, String, String, FileAttributes<?>)它创建新文件,并使用 Stream I/O 写入文件。还通过使用 Channel I/O 执行读写操作。
File.existsFiles.exists and Files.notExists它检查或验证文件是否存在。
File.compareTo and equalsPath.compareTo and equals它用于比较两个路径。
File.getAbsolutePath and getAbsoluteFilePath.toAbsolutePath它转换路径
File.getCanonicalPath and getCanonicalFilePath.toRealPath or normalize它用于规范化(删除冗余)路径,并将其转换为真实路径。
File.toURIPath.toURI它将路径转换为 URI。
File.isHiddenFiles.isHidden它用于检索文件信息。
File.list and listFilesPath.newDirectoryStream它用于列出目录的内容。
File.mkdir and mkdirsFiles.createDirectory它用于创建目录。
File.listRootsFileSystem.getRootDirectories它用于列出系统根目录的文件。
File.getTotalSpace, File.getFreeSpace, File.getUsableSpaceFileStore.getTotalSpace, FileStore.getUnallocatedSpace, FileStore.getUsableSpace, FileStore.getTotalSpace它用于存储文件属性。

其他一些比较如下

  • File 类比 Path 类更面向对象。
  • 从 GC 的角度来看,基于 Path API 的 I/O 流比 File 类更便宜。
  • 通常,Path 类会在执行任何操作时抛出 IOException 并返回一个布尔值。

下一个主题Java 中的序列化