13.4 NIO和NIO.2
目录
[13.4 NIO和NIO.2](#13.4 NIO和NIO.2)
[13.4.1 引入](#13.4.1 引入)
[13.4.2 文件系统和路径](#13.4.2 文件系统和路径)
[13.4.3 FileSystem类](#13.4.3 FileSystem类)
13.4.1 引入
应用场景:为了增强Java I/O功能,在JDK1.4中新增了一些新的API,称为NIO(new I/O) ,NIO API是java.nio及其子包的一部分。在JDK7中又新引进了一些包,称作NIO.2 ,用来对现有技术进行补充。NIO.2的接口和类通过java.nio.file包及其子包提供
13.4.2 文件系统和路径
一个文件系统可以包含三类对象:文件、目录(也称文件夹)和符号链接(symbolic link) ,当今的大多数操作系统都支持文件和目录,并且允许目录包含子文件。处于目录树顶部的目录称作根目录。Linux/UNIX类操作系统只有一个根目录:"/",且支持符号链接 。Windows系统可以有多个根目录:"C:\""D:\"等,且不支持符号链接
在文件系统中,文件和目录都是通过路径表示的,路径可以是绝对的,也可以是相对的。路径通常以根节点开头。图13-1显示了一个Windows系统中目录树的结构。这里的根目录是"C:\" "D:\" "E:\"。
反斜杠"\"表示路径分隔符
绝对路径是以根元素为结点的路径。例如D:\study\user\report.txt就是绝对路径。绝对路径包含定位文件的所有信息。相对路径是不包含根元素的路径。例如,study\com\Hello.java是相对路径。只通过相对路径不能定位文件,要定位这些文件还需要另外的路径信息
注意:在Solaris OS 和Linux 系统中,文件系统是单根结构 ,根节点为("/"),路径分隔符为斜线(/)
图13-1
13.4.3 FileSystem类
FileSystem表示一个文件系统,是一个抽象类,可以调用FileSystems类的getDefault()静态方法来获取当前的文件系统
FileSystem fileSystem =FileSystems.getDefault();
FileSystem类中定义了下面一些常用方法:
1.abstract Path getPath(String first,String...more):返回字符串first指定的路径对象。可选参数more用来指定后续路径
2.abstract String getSeparator():返回路径分隔符。在Windows系统中,它是"\",在UNIX/Linux系统中,它是"/"
3.abstract Iterable<Path>getRootDirectores():返回一个Iterable对象,可以用来遍历根目录
4.abstract boolean isOpen():返回文件系统是否打开
5.abstract boolean isReadOnly():返回该文件系统是否只读
13.4.4 Path对象
在Java7之前,文件和目录用File对象表示。由于使用File类存在着许多不足,因此在Java7中应使用NIO.2的java.io.file.Path接口代替File。
Path对象在文件系统中表示文件或目录。这个接口命名比较恰当,表示一个路径,可以是一个文件、一个目录、也可以是一个符号链接,还可以表示一个根目录。
正如名称所示,Path在文件系统中表示路径。一个Path对象包含构成路径的目录列表和文件命,用来检查、定位和操作文件。在Windows系统中,Path对象使用Windows语法表示(如D:\study\com\demo)
有多种方式创建和操作Path实例,可以把一个Path对象追加到另一个Path对象上,抽取Path对象部分内容、与另一个Path对象比较等
注意:在JDK7之前使用java.io.File的代码,可以使用File类的toPath()方法转换成Path对象,从而利用Path功能
1.创建Path实例
Path实例 包含确定文件或目录位置的信息 。在创建Path实例时,通常要提供一系列名称,如根元素或文件名等。一个Path可以只包含路径名和文件名。
可以使用Paths (注意复数)类的get()方法创建Path对象
1.Path p1=Paths.get("D:\\study\\com\\Hello.java")
2.Path p2=Paths.get(args[0])
3.Path p3=Paths.get(URI.create("file:///users/joe/FileTest.java"))
实际上,Paths类的get()方法时下面代码的简化形式:
Path p4=FileSystems.getDefault().getPath("D:\\study\\com\\Hello.java")
注意:创建一个Path对象并不意味着在磁盘中创建一个物理意义上的文件或目录,与Path对应的文件或目录可以不存在,为了创建文件或目录,需要使用Files类
2.检索路径信息
Path对象可以看作是一个名称序列,每一级目录可以通过索引指定。目录结构的顶层索引为0,目录结构的底层元素所以是n-1,n是总层数。例如,getName(0)方法将返回最顶层目录名称。下面代码演示了Path接口的几个方法。
Path path=Paths.get("D:\\study\\user\\report.txt")
System.out.println("toString:"+path.toString());
System.out.println("getFileName:"path.getFileName());
System.out.println("getName(0):"+path.getName(0));
System.out.println("getNameCount:"+path.getNameCount());
System.out.println("subpath(0,2):"+path.subpath(0,2));
System.out.println("getParent:"+ path.getParent());
System.out.println("getRoot:"+path.getRoot());
上述代码的输出结果如下,
toString:D:\study\user\report.txt
getFileName:report.txt
getName(0):study
getNameCount:3
subpath(0,2):study\user
getParent:D:\study\user
getRoot:D: