想要初步了解 NIO.2 API,也就是通常所说的“JSR203: More New I/O APIs for the Java Platform”,最好的切入点就是新的抽象类 java.nio.file.Path 类。这个类是 NIO.2 的里程碑,所有应用程序中的 I/O 操作都和这个类密不可分。这个类几乎可以说是 NIO.2 中最常用的类。
Path 类简介
文件路径存在于文件系统中。文件系统可以通过 java.nio.file.FileSystems 这个 final 类来进行访问,从这个类中可以获取 java.nio.file.FileSystem 类的对象。FileSystems 类提供了下面两个很重要的方法,同时也提供了 newFileSystem() 方法,用来创建一个新的文件系统:
- getDefault():这个静态方法返回 JVM 默认的 FileSystem – 一般说来,也就是操作系统的默认文件系统。
- getFileSystem(URI uri):这个静态方法从一组文件系统提供者中返回一个与 URI 匹配的文件系统(FileSystem)。Path 类可以在任何文件系统(FileSystem)和任何存储空间(java.nio.file.FileStore; 这个类反应了底层的存储)上操作文件。默认情况下(最常用),Path 类引用默认文件系统(计算机的文件系统)的文件,但是 NIO.2 是完全模块化的—— FileSystem 的具体实现是在内存中的一组数据,因此在网络环境或在虚拟文件系统中,NIO.2 也完全适用。NIO.2 提供给我们在文件系统中操作文件、文件夹或链接的所有方法。
Path 类是 java.io.File 类的升级版,但是在 File 类中还保留了一些特殊的操作,因此 File 类并没有过时或不推荐使用。并且,从 Java 7 开始,两个类都可以使用,这意味着,开发者可以混合使用两个类来编写最好的 I/O 应用。 Java 7 提供了简单的 API 对这两个类进行相互转换。
想想你曾经编写过的类似下面的代码:
1
2
3
|
import java.io.File;
…
File file=newFile("index.html");
|
从 Java 7 开始,不再需要这样写了,你可以转换为:
1
2
3
4
|
import java.nio.file.Path;
import java.nio.file.Paths;
…
Path path=Paths.get("index.html");
|
仔细看看,Path 类相当于用编程的方式来反应文件系统中的路径。路径的字符串中包含了文件名,目录列表以及操作系统相关的分隔符(例如,在 Windows 中是反斜线“”,在 Linux 中是正斜线“/”),这意味着 Path 类不是系统独立,而是依赖于系统路径字符串。由于 Path 类基于字符串创建,因此它引用的资源也有可能不存在。