上一节讲过的Path,貌似很多人觉得没有啥作用,但是在JAVA NIO.2 中,很多后续的特性都是依赖于这个Path的;
例如本文中的Attibute属性,不同的操作系统中的文件有不同的属性,而这些操作都是在Path之后进行;
Attibute属性,在JAVA NIO.2 的文件系统中,根据操作系统特性的不同,分为几个不同的View,这些View的定义都在java.nio.file.attribute包中:

这些View怎么理解呢?
例如DOS系统下的文件,有可能该文件是系统文件(也就是System32下面的,或者标注为dll的),也有可能是windows的归档文件;
在linux(Posix)系统下,我们知道用户组的概念,这是Posix独有的(虽然后来windows模仿也有了),其次对于一个文件的权限,例如 drwxr-xr-x ,第一位代表目录或者文件,后面三组分别是读,写,执行的组合,分别代表用户,用户组,其它用户的权限,这种精炼的表达方法只有Posix中才有,如果想操作这个,那必须得是具体的View;
其次,文件还有很多的通用属性,例如LastModify,时间,等等;
上述这些属性,在java.io.File中是不可以访问的,而这个JAVA NIO.2中,就提供了这些接口可以针对于不同操作系统的文件进行修改,以View的形式,我们来看看一个程序,查看Windows7下到底支持什么?

FileSystems.getDefault是获取当前文件系统,这个在上一篇文章中,我们已经讲过,是当前环境的一个抽象;
从FileSystem可以有方法,suuportedFileAttributeViews是看看当前环境支持多少种View?
遍历这个Set集合,获得了5种View,这也就意味着一个文件系统可以支持几种不同的View同时存在;
对于Win7来讲,几个不同的View为:
ACL:访问控制协议,如果当前文件系统支持这个协议,相当于会多一些属性可以操作,如permit,deny,并且可以对源进行控制和过滤;
Basic:基础的文件属性,如LastModify,time,创建时间,等等,这个比较通用;
Owner:创建者的属性
DOS:属于DOS系统;
我们可以看到,没有基于Posix的View,程序还是挺准的;
下面我们基于这几个View逐一的讲解一下。
1.Basic View
Basic View是文件的通用的属性,如下面的程序:

如我们可以获得文件的大小,创建时间,上次访问时间,上次修改时间,是否是文件夹,是否是符号链接文件...
这些属性,有的通过java.io可以获得,有的获得不到;
2.Dos View
Dos视图是基于Windows的Dos系统的,主要是有下面的几个属性:

能判断该文件是否只读,是否是隐藏文件(Windows独有)。是否是归档文件,是否是系统文件(System32)
3.File Owner View
这个文件Owner的View其实很简单,就是可以设置和修改文件的owner,这个在原有的java.io包中肯定是没有的:

上述的功能完成的是,首先查找当前文件系统中apress的用户权限,
然后将这个用户权限设置给BNP.txt的;
4.Posix View
前面提到了基于Posix的View,可以获得用户组,和权限:

权限就是drw--rw--rw这种字符串;这种字符串仅仅Posix才可以获得
5.ACL View
ACL是访问控制权限文件系统,在java.nio.file.attribute包中,特意针对于ACL进行了很多类的抽象:

对于上述的ACLList表中的内容,有下面的几个entry:

type是ACL的类型,有ALARM,ALLOW,AUDIT,DENY这几种;
principal实际就是UserPrinipal,
permissions是权限,映射为AclEntryPermission
flag是继承查看,AclEntryFlag,
这些属性的获取都需要有当前文件系统的ACL支持才行;
6.File Store View
File Store的视图就是把当前的文件系统当成磁盘一样看,对其大小,剩余空间有一个判断,
这些接口对接的应该是操作系统的系统调用:

7.User Defined View
还可以自定义View,自己加属性,修改,读取,并删除:

总结:
在java.io包中,虽然可以针对于文件的属性进行读取,但仅仅限制于几个常用属性,如大小等;
而在JAVA NIO2的java.nio.file.Attributes包中,使用View的机制,空前开放了对文件属性的各种读取,并且可以自定义属性,可谓是JAVA NIO2中文件IO的一大改进;




