旧版文件 I/O 代码

与旧版代码的互操作性

在 Java SE 7 发行版之前,java.io.File类是用于文件 I/O 的机制,但是它有一些缺点。

  • 许多方法在失败时都不会引发异常,因此不可能获得有用的错误消息。例如,如果文件删除失败,则程序将收到“删除失败”信息,但不知道是否是因为文件不存在,用户没有权限或其他问题。

  • rename方法在跨平台上无法始终如一地工作。

  • 没有 true 支持符号链接。

  • 需要对元数据的更多支持,例如文件权限,文件所有者和其他安全属性。

  • 访问文件元数据效率低下。

  • 许多File方法无法扩展。在服务器上请求大型目录列表可能会导致挂起。大目录还可能导致内存资源问题,从而导致拒绝服务。

  • 如果存在圆形符号链接,则不可能编写可靠的代码来递归遍历文件树并做出适当响应。

也许您有使用java.io.File的旧代码,并想利用java.nio.file.Path功能,而对您的代码的影响却很小。

java.io.File类提供toPath方法,该方法将旧样式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.io.File 功能 Map 到 java.nio.file

由于文件 I/O 的 Java 实现在 Java SE 7 发行版中已完全重新设计,因此您不能将一种方法交换为另一种方法。如果要使用java.nio.file软件包提供的丰富功能,最简单的解决方案是使用上一节中建议的File.toPath方法。但是,如果您不想使用该方法或不足以满足您的需要,则必须重写文件 I/O 代码。

这两个 API 之间没有一对一的对应关系,但是下表使您大致了解java.io.File API 中的功能 Map 到java.nio.file API 中的功能,并告诉您可以在哪里获得更多信息。

java.io.File Functionalityjava.nio.file FunctionalityTutorial Coverage
java.io.Filejava.nio.file.Path路径类
java.io.RandomAccessFileSeekableByteChannel功能。随机存取 Files
File.canRead , canWrite , canExecuteFiles.isReadableFiles.isWritableFiles.isExecutable

在 UNIX 文件系统上,管理 元数据(文件和文件存储属性)软件包用于检查九个文件许可权。 检查文件或目录
Managing Metadata
File.isDirectory()File.isFile()File.length()Files.isDirectory(Path, LinkOption...)Files.isRegularFile(Path, LinkOption...)Files.size(Path)Managing Metadata
File.lastModified()File.setLastModified(long)Files.getLastModifiedTime(Path, LinkOption...)Files.setLastMOdifiedTime(Path, FileTime)Managing Metadata
设置各种属性的File方法:setExecutablesetReadablesetReadOnlysetWritable这些方法被Files方法setAttribute(Path, String, Object, LinkOption...)代替。 Managing Metadata
new File(parent, "newfile")parent.resolve("newfile")Path Operations
File.renameToFiles.move移动文件或目录
File.deleteFiles.delete删除文件或目录
File.createNewFileFiles.createFileCreating Files
File.deleteOnExitcreateFile方法中指定的DELETE_ON_CLOSE选项代替。 Creating Files
File.createTempFileFiles.createTempFile(Path, String, FileAttributes<?>)Files.createTempFile(Path, String, String, FileAttributes<?>)Creating Files
使用流 I/O 创建和写入文件
使用通道 I/O 读写文件
File.existsFiles.existsFiles.notExists验证文件或目录的存在
File.compareToequalsPath.compareToequals比较两条路径
File.getAbsolutePathgetAbsoluteFilePath.toAbsolutePath转换路径
File.getCanonicalPathgetCanonicalFilePath.toRealPathnormalize转换路径(toRealPath)
从路径中删除冗余(规范化)
File.toURIPath.toURI转换路径
File.isHiddenFiles.isHidden检索有关路径的信息
File.listlistFilesPath.newDirectoryStream列出目录的内容
File.mkdirmkdirsPath.createDirectory创建目录
File.listRootsFileSystem.getRootDirectories列出文件系统的根目录
File.getTotalSpaceFile.getFreeSpaceFile.getUsableSpaceFileStore.getTotalSpaceFileStore.getUnallocatedSpaceFileStore.getUsableSpaceFileStore.getTotalSpace文件存储属性