Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
在 Java SE 7 发行版之前,java.io.File
类是用于文件 I/O 的机制,但它有几个缺点。
rename
方法不能跨平台一致地工作。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
对象。
由于文件 I/O 的 Java 实现已在 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 |
路径类 |
java.io.RandomAccessFile |
SeekableByteChannel 功能。 |
随机访问文件 |
File.canRead ,canWrite ,canExecute |
Files.isReadable ,Files.isWritable 和 Files.isExecutable 。在 UNIX 文件系统上,Managing Metadata (File and File Store Attributes) 包用于检查九个文件权限。 |
检查文件或目录 管理元数据 |
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 |
替换为 createFile 方法中指定的 DELETE_ON_CLOSE 选项。 |
创建文件 |
File.createTempFile |
Files.createTempFile(Path, String, FileAttributes<?>) ,Files.createTempFile(Path, String, String, FileAttributes<?>) |
创建文件 使用流 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 )从路径中移除冗余( normalize ) |
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 |
文件存储属性 |