转自
花了几天把这本书初略的看了一下, 之所以初略的看了一下,是因为这书里确实没啥内容。如果去了NIO 1的内容和大段大段的代码, 基本上压缩到50页应该没问题。
下面简单的罗列一下看到的内容:
Path
这个类在java.nio.file,在NIO里对文件系统进行了进一步的抽象。 是用来替换原来的java.io.File。其中 FileSystems, Files, Path, PathMatcher 成为一个体系。
在java7里File和Path可以相互转换: File.toPath(), Path.toFile()
原来的File里包含了文件引用和文件,在Path系统里, Path里是文件的引用,而文件操作都放到了Files的静态方法里。这种方式究竟好不好用,我没啥感觉。不过我个人偏向于把操作放到另外一个类里面。
获得Path实例的方式:File.toPath(), Paths.get(), FileSystem.getPath()
注意: Path和File一样,能创建出实例不代表着这个文件一定在文件系统里真是存在。
Path和File相比使用上方便了的地方:
不用特意指定路径的separator:Paths.get("C:","folder1","subfolder","aa.txt")
在windows系统了是C:\folder1\subfolder\aa.txt
在Mac下是C:/folder/subfolder/aa.txt
Java会根据当前操作系统来决定separator
重复利用基本路径:
而resolveSibling方法更加好用:可以直接获取相同目录下的其他文件:
取得相对路径:
假设BNP.txt和AEGON.txt在同一目录下
假设:
那么:
遍历:
Path实现了Iterable
猜猜结果是什么?
我一开始以为是吧目录下的文件遍历出来呢。结果是这样的:
rafaelnadal
tournaments
2009
BNP.txt
说实话,我觉得这个比较坑爹!
文件属性
java.nio.file.attribute包下的类提供了获取文件属性的类,针对不同操作系统使用的类不太一样,当然也有所有操作系统通用的属性。
属性分类有一些几种:
BasicFileAttributeView
DosFileAttributeView
PosixFileAttributeView
FileOwnerAttributeView
AclFileAttributeView
UserDefinedFileAttributeView
获取属性:
或
long size = (Long)Files.getAttribute(path, "basic:size", NOFOLLOW_LINKS);
设置属性:
或
Symbolic和Hard Links
相同于用Java程序实现linux下的 ln命令。
DirectoryStream
这也是一个比较有用的类:用来遍历路径下的子路径或文件,而且支持通配符过滤。
FileVisitor和Files.walkFileTree
FileVisitor是一个接口,Files.walkFileTree是一个方法。 通过两者的配合可以遍历整个某个路径下的所有子路径和文件。没有这个之前我们用递归方法也能实现,有了这个不能说是现实更加容易, 只能说是现实更加规范, 如果大家都用这个,代码的可维护性会更好。我觉得仅此而已。
FileVisitor有四个方法
FileVisitResult postVisitDirectory(T dir, IOException exc)
Invoked for a directory after entries in the directory, and all of their descendants, have been visited.FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs)
Invoked for a directory before entries in the directory are visited.
+FileVisitResult visitFile(T file, BasicFileAttributes attrs)
Invoked for a file in a directory.FileVisitResult visitFileFailed(T file, IOException exc)
Invoked for a file that could not be visited.
FileVisitResult枚举类型:
CONTINUE,SKIP_SIBLINGS,SKIP_SUBTREE,TERMINATE
Watch Service API
这是NIO2里比较重要的一个新增功能, 以前直接用java监视文件系统的变化是不可能的,只能通过jni的方式调用操作系统的api来对文件系统进行监视。在java7里这部分被加到了标准库里,这样我们就不能在去寻找jni的结果方案了。但是事实上为了保持java的扩平台特性,监控的功能范围被定为各个操作系统的交集,所以没有特殊的情况还是需要直接调用操作系统的api来实现。
Random Access Files
主要是提供了一个SeekableByteChannel接口,配合ByteBuffer使随机访问文件更加方便。
Asynchronous Channel API
这个是NIO2的较大的变化,有原来的Selecor方法变成方法回调模式。使用上更加方便。并且文件的读写也可以异步的方式实现了。
异步读取文件 :
异步socket服务器