# 旧文件 I / O 代码

> 原文： [https://docs.oracle.com/javase/tutorial/essential/io/legacy.html](https://docs.oracle.com/javase/tutorial/essential/io/legacy.html)

在 Java SE 7 发布之前，`java.io.File`类是用于文件 I / O 的机制，但它有几个缺点。

*   许多方法在失败时都没有抛出异常，因此无法获得有用的错误消息。例如，如果文件删除失败，程序将收到“删除失败”，但不知道是否因为该文件不存在，用户没有权限，或者还有其他问题。
*   `rename`方法不能跨平台一致地工作。
*   没有真正支持符号链接。
*   需要更多对元数据的支持，例如文件权限，文件所有者和其他安全属性。
*   访问文件元数据效率低下。
*   许多`File`方法没有扩展。通过服务器请求大型目录列表可能会导致挂起。大目录也可能导致内存资源问题，导致拒绝服务。
*   如果存在循环符号链接，则无法编写可递归遍历文件树并正确响应的可靠代码。

也许您有使用`java.io.File`的遗留代码，并希望利用`java.nio.file.Path`功能，而对代码的影响最小。

`java.io.File`类提供 [`toPath`](https://docs.oracle.com/javase/8/docs/api/java/io/File.html#toPath--) 方法，该方法将旧样式`File`实例转换为`java.nio.file.Path`实例，如下所示：

```
Path input = file.toPath();

```

然后，您可以利用`Path`类可用的丰富功能集。

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

```
file.delete();

```

您可以修改此代码以使用`Files.delete`方法，如下所示：

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

```

相反， [`Path.toFile`](https://docs.oracle.com/javase/8/docs/api/java/nio/file/Path.html#toFile--) 方法为`Path`对象构造`java.io.File`对象。

由于文件 I / O 的 Java 实现已在 Java SE 7 发行版中完全重新构建，因此您无法将一种方法替换为另一种方法。如果您想使用`java.nio.file`软件包提供的丰富功能，最简单的解决方案是使用上一节中建议的 [`File.toPath`](https://docs.oracle.com/javase/8/docs/api/java/io/File.html#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` | [路径类](pathClass.html) |
| `java.io.RandomAccessFile` | `SeekableByteChannel`功能。 | [随机存取文件](rafs.html) |
| `File.canRead`，`canWrite`，`canExecute` | `Files.isReadable`，`Files.isWritable`和`Files.isExecutable`。
在 UNIX 文件系统上，[管理元数据（文件和文件存储属性）](fileAttr.html)包用于检查九个文件权限。 | [检查文件或目录](check.html)
[管理元数据](fileAttr.html) |
| `File.isDirectory()`，`File.isFile()`和`File.length()` | `Files.isDirectory(Path, LinkOption...)`，`Files.isRegularFile(Path, LinkOption...)`和`Files.size(Path)` | [管理元数据](fileAttr.html) |
| `File.lastModified()`和`File.setLastModified(long)` | `Files.getLastModifiedTime(Path, LinkOption...)`和`Files.setLastMOdifiedTime(Path, FileTime)` | [管理元数据](fileAttr.html) |
| 设置各种属性的`File`方法：`setExecutable`，`setReadable`，`setReadOnly`，`setWritable` | 这些方法被`Files`方法`setAttribute(Path, String, Object, LinkOption...)`取代。 | [管理元数据](fileAttr.html) |
| `new File(parent, "newfile")` | `parent.resolve("newfile")` | [路径操作](pathOps.html) |
| `File.renameTo` | `Files.move` | [移动文件或目录](move.html) |
| `File.delete` | `Files.delete` | [删除文件或目录](delete.html) |
| `File.createNewFile` | `Files.createFile` | [创建文件](file.html#createFile) |
| `File.deleteOnExit` | 替换为`createFile`方法中指定的`DELETE_ON_CLOSE`选项。 | [创建文件](file.html#createFile) |
| `File.createTempFile` | `Files.createTempFile(Path, String, FileAttributes&lt;?&gt;)`，`Files.createTempFile(Path, String, String, FileAttributes&lt;?&gt;)` | [创建文件](file.html#createFile)
[使用流 I / O 创建和写入文件](file.html#createStream)
[使用通道 I / O 读取和写入文件](file.html#channelio) |
| `File.exists` | `Files.exists`和`Files.notExists` | [验证文件或目录的存在](check.html) |
| `File.compareTo`和`equals` | `Path.compareTo`和`equals` | [比较两条路径](pathOps.html#compare) |
| `File.getAbsolutePath`和`getAbsoluteFile` | `Path.toAbsolutePath` | [转换路径](pathOps.html#convert) |
| `File.getCanonicalPath`和`getCanonicalFile` | `Path.toRealPath`或`normalize` | [转换路径（`toRealPath`）](pathOps.html#convert)
[从路径中删除冗余（`normalize`）](pathOps.html#normal) |
| `File.toURI` | `Path.toURI` | [转换路径](pathOps.html#convert) |
| `File.isHidden` | `Files.isHidden` | [检索路径信息](pathOps.html#info) |
| `File.list`和`listFiles` | `Path.newDirectoryStream` | [列出目录的内容](dirs.html#listdir) |
| `File.mkdir`和`mkdirs` | `Path.createDirectory` | [创建目录](dirs.html#create) |
| `File.listRoots` | `FileSystem.getRootDirectories` | [列出文件系统的根目录](dirs.html#listall) |
| `File.getTotalSpace`，`File.getFreeSpace`，`File.getUsableSpace` | `FileStore.getTotalSpace`，`FileStore.getUnallocatedSpace`，`FileStore.getUsableSpace`，`FileStore.getTotalSpace` | [文件存储属性](fileAttr.html#store) |