当前教程
使用路径访问资源
系列中的下一个

系列中的下一个: 使用路径

使用路径访问资源

 

介绍传统 File 类

在 Java 中,有两种方法可以对文件系统上的文件或路径进行建模。第一个是传统的 File 类。这里提到了这个类,并附带一个警告:除非有充分的理由,否则您不应该在代码中使用它。您应该优先使用 Path 接口,本节也将介绍该接口。与 Files 中的工厂方法一起,它为您提供了比 File 类更多的功能,以及更好的性能,尤其是在访问较大的文件和目录时。

话虽如此,由于它在传统代码中被广泛使用,因此了解 File 仍然可能对您很重要。在我们深入研究之前,让我们介绍一下这个类的主要概念。

File 类的实例可以表示文件系统上的任何内容:文件、目录、符号链接、相对路径或绝对路径。此实例是一个抽象概念。创建这样的实例不会在您的文件系统上创建任何内容。您可以使用此类查询您的文件系统,但您需要显式地执行此操作。

File 的实例不允许您访问它所代表的文件的内容。使用此实例,您可以检查此文件是否存在或是否可读(除其他事项外)。

文件由多个元素组成,这些元素由分隔符分隔,分隔符取决于您的文件系统。第一个元素可能是前缀,例如磁盘驱动器说明符、UNIX 根目录的斜杠。其他元素是名称。

创建 File 实例

您可以使用多个构造函数创建 File 类的实例

获取文件的元素

以下方法为您提供有关此文件元素的信息

  • getName(): 返回此文件对象所表示的文件或目录的名称。这仅仅是序列中的最后一个名称。
  • getParent(): 返回此抽象路径名的父路径名的字符串,如果此路径名没有命名父目录,则返回 null。
  • getPath(): 返回此抽象路径名转换为路径名字符串。此方法与 Path 接口无关。
  • getAbsolutePath(): 返回此抽象路径名的绝对路径名字符串。如果此抽象路径名已经是绝对路径名,则简单地返回路径名字符串。否则,此路径名将以系统相关的方式解析。
  • getCanonicalPath(): 返回此抽象路径名的规范路径名字符串。规范路径名是绝对的、唯一的,并且与系统相关。此规范路径名的构造通常涉及从路径名中删除冗余名称,例如 ...,以及解析符号链接。

获取有关文件或目录的信息

其中一些方法可能需要对文件或目录的特殊权限。作为传统类,File 不会公开您的文件系统提供的所有安全属性。

操作文件和目录

一些方法允许您在文件系统上创建文件和目录。大多数方法与文件系统相关。请记住,这些方法是传统方法。您可以查看 将您的代码重构为使用 Path 部分,以将您的代码重构为使用 Path 接口和 Files 类中的等效方法。

  • createNewFile(): 尝试从该路径名创建一个新文件。如果该文件已存在,则创建将失败。如果文件创建成功,此方法返回 true,否则返回 false
  • delete(): 删除由该抽象路径名表示的文件或目录。如果该路径名表示一个目录,则该目录必须为空才能被删除。如果文件成功删除,此方法返回 true,否则返回 false。您应该优先使用 Files.delete() 方法,因为它在删除失败时会提供更多信息。
  • mkdirs()mkdir(): 创建一个由该抽象路径名表示的目录。 mkdirs() 会在需要时创建所有中间目录。
  • renameTo(file): 重命名由该抽象路径名表示的文件。

 

介绍 Path 接口

在 Java SE 7 版本中引入的 Path 类是 java.nio.file 包的主要入口点之一。如果您的应用程序使用文件 I/O,您将需要了解此接口的强大功能。

版本说明:如果您有使用 java.io.File 的 JDK7 之前的代码,您仍然可以使用 File.toPath() 方法来利用 Path 接口的功能。有关更多信息,请参见下一节。顾名思义,Path 接口是文件系统中路径的编程表示。一个 Path 对象包含用于构造路径的文件名和目录列表,并用于检查、定位和操作文件。

一个 Path 实例反映了底层平台。在 Solaris 操作系统中,一个 Path 使用 Solaris 语法 (/home/joe/foo),而在 Microsoft Windows 中,一个 Path 使用 Windows 语法 (C:\home\joe\foo)。一个 Path 不是系统无关的。您不能比较来自 Solaris 文件系统和来自 Windows 文件系统的 Path,即使目录结构相同且两个实例都定位了相同的相对文件。

Path 对应的文件或目录可能不存在。您可以创建一个 Path 实例并以各种方式操作它:您可以追加到它,提取它的部分,将其与另一个路径进行比较。在适当的时候,您可以使用 Files 类中的方法来检查与 Path 对应的文件是否存在,创建文件,打开文件,删除文件,更改其权限等等。

 

重构您的代码以使用 Path

也许您有使用 java.io.File 的遗留代码,并且希望以最小的代码影响来利用 java.nio.file.Path 功能。

java.io.File 类提供了 toPath() 方法,该方法将旧式 java.io.File 实例转换为 java.nio.file.Path 实例,如下所示

Path input = file.toPath();

然后,您可以利用 Path 接口提供的丰富功能集。

例如,假设您有一些删除文件的代码

file.delete();

您可以修改此代码以使用 Files.delete() 工厂方法,如下所示

Path fp = file.toPath();
Files.delete(fp);

相反,Path.toFile() 方法为 Path 对象构造一个 java.io.File 对象。

由于 Java 中的文件 I/O 实现已在 Java SE 7 版本中完全重新架构,因此您不能将一种方法替换为另一种方法。如果您想使用 java.nio.file 包提供的丰富功能,最简单的解决方案是使用 File.toPath() 方法。但是,如果您不想使用这种方法或它不足以满足您的需求,则必须重写您的文件 I/O 代码。

这两个 API 之间没有一一对应的关系,但下表为您提供了一个关于 java.io.File API 中的功能映射到 java.nio.file API 中的哪些功能的一般了解,并告诉您可以在哪里获得更多信息。

java.io.File 功能 java.nio.file 功能 教程覆盖范围
java.io.File java.nio.file.Path Path 接口
java.io.RandomAccessFile SeekableByteChannel 功能。 随机访问文件
File.canRead()File.canWrite()File.canExecute() Files.isReadable()Files.isWritable()Files.isExecutable()。在 UNIX 文件系统上,使用管理元数据(文件和文件存储属性)包来检查九个文件权限。 检查文件或目录管理元数据
File.isDirectory()File.isFile()File.length() Files.isDirectory(Path, LinkOption...)Files.isRegularFile(Path, LinkOption...)Files.size(Path) 管理元数据
File.lastModified()File.setLastModified(long) Files.getLastModifiedTime(Path, LinkOption...)Files.setLastModifiedTime(Path, FileTime) 管理元数据
设置各种属性的 File 方法:setExecutable()setReadable()setReadOnly()setWritable() 这些方法被 Files 方法 setAttribute(Path, String, Object, LinkOption...) 替换。 管理元数据
new File(parent, "newfile") parent.resolve("newfile") 路径操作
File.renameTo() Files.move() 移动文件或目录
File.delete() Files.delete() 删除文件或目录
File.createNewFile() Files.createFile() 创建文件
File.deleteOnExit() DELETE_ON_CLOSE 选项替换,该选项在 Files.createFile() 方法中指定。 创建文件
File.createTempFile() Files.createTempFile(String, String, FileAttributes<?>)Files.createTempFile(Path, String, FileAttributes<?>) 创建文件、使用流 I/O 创建和写入文件、使用通道 I/O 读取和写入文件
File.exists() Files.exists()Files.notExists() 验证文件或目录是否存在
File.compareTo()File.equals() Path.compareTo()Path.equals() 比较两条路径
File.getAbsolutePath()File.getAbsoluteFile() Path.toAbsolutePath() 转换路径、从路径中删除冗余(规范化)
File.getCanonicalPath()File.getCanonicalFile() Path.toRealPath()Path.normalize() 转换路径(toRealPath)
File.toURI() Path.toUri() 转换路径
File.isHidden() Files.isHidden() 检索有关路径的信息
File.list() 和 listFiles Files.newDirectoryStream() 列出目录的内容
File.mkdir() 和 mkdirs Files.createDirectory(Path,FileAttribute) 创建目录
File.listRoots() FileSystem.getRootDirectories() 列出文件系统的根目录
File.getTotalSpace()File.getFreeSpace()File.getUsableSpace() FileStore.getTotalSpace()FileStore.getUnallocatedSpace()FileStore.getUsableSpace()FileStore.getTotalSpace() 文件存储属性

上次更新: 2023 年 1 月 25 日


当前教程
使用路径访问资源
系列中的下一个

系列中的下一个: 使用路径