旧版文件 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 Functionality | java.nio.file Functionality | Tutorial Coverage |
---|---|---|
java.io.File | java.nio.file.Path | 路径类 |
java.io.RandomAccessFile | SeekableByteChannel 功能。 | 随机存取 Files |
File.canRead , canWrite , canExecute | Files.isReadable ,Files.isWritable 和Files.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 方法:setExecutable ,setReadable ,setReadOnly ,setWritable | 这些方法被Files 方法setAttribute(Path, String, Object, LinkOption...) 代替。 Managing Metadata | |
new File(parent, "newfile") | parent.resolve("newfile") | Path Operations |
File.renameTo | Files.move | 移动文件或目录 |
File.delete | Files.delete | 删除文件或目录 |
File.createNewFile | Files.createFile | Creating Files |
File.deleteOnExit | 由createFile 方法中指定的DELETE_ON_CLOSE 选项代替。 Creating Files | |
File.createTempFile | Files.createTempFile(Path, String, FileAttributes<?>) ,Files.createTempFile(Path, String, String, FileAttributes<?>) | Creating Files 使用流 I/O 创建和写入文件 使用通道 I/O 读写文件 |
File.exists | Files.exists 和Files.notExists | 验证文件或目录的存在 |
File.compareTo 和equals | Path.compareTo 和equals | 比较两条路径 |
File.getAbsolutePath 和getAbsoluteFile | Path.toAbsolutePath | 转换路径 |
File.getCanonicalPath 和getCanonicalFile | Path.toRealPath 或normalize | 转换路径(toRealPath) 从路径中删除冗余(规范化) |
File.toURI | Path.toURI | 转换路径 |
File.isHidden | Files.isHidden | 检索有关路径的信息 |
File.list 和listFiles | Path.newDirectoryStream | 列出目录的内容 |
File.mkdir 和mkdirs | Path.createDirectory | 创建目录 |
File.listRoots | FileSystem.getRootDirectories | 列出文件系统的根目录 |
File.getTotalSpace ,File.getFreeSpace ,File.getUsableSpace | FileStore.getTotalSpace ,FileStore.getUnallocatedSpace ,FileStore.getUsableSpace ,FileStore.getTotalSpace | 文件存储属性 |