Java7 NIO 之文件系统访问

Java7中 的I/O库得到了进一步增强,成为NIO.2 。 NIO.2 中包含的主要内容包括文件系统访问和异步I/O通道.


Java 7 加强了文件操作相关的功能,使用java.nio.file包的类实现。


1.文件路径的抽象:Path 类


(1)创建Path:


Path path1 = Paths.get("E:\\book\\"); //创建path
Path path2 = Paths.get("java\\1.txt");
Path p2 = Paths.get(filename);
Path p3 = Paths.get(URI.create("C://File.java"));

(2)获取path信息

Path path = Paths.get("D:\\Program Files\\Java\\text.txt");
 
System.out.format("toString: %s%n", path.toString());        //D:\Program Files\Java\text.txt
System.out.format("getFileName: %s%n", path.getFileName());    //text.txt
System.out.format("getName(0): %s%n", path.getName(0));        //Program Files
System.out.format("getNameCount: %d%n", path.getNameCount());    //3
System.out.format("subpath(0,2): %s%n", path.subpath(0,2));    // Program Files\Java
System.out.format("getParent: %s%n", path.getParent());        // D:\Program Files\Java
System.out.format("getRoot: %s%n", path.getRoot());            //D:\

(3)连接两个path:

(1)当被连接的 path 不包含的根路径时,会直接将此 path 连接到原 path 后面,如下:

Path path3 = path1.resolve(path2); //把path1当成父目录解析;
		Path path4 = path1.resolveSibling(path2);//把path1的父目录当成父目录解析
		
		System.out.println(path3.toString());//E:\book\java\1.txt
		System.out.println(path4.toString());//E:\java\1.txt

(2)当被连接的 path 包含根路径时,resolve()h会返回此 path 对象:

System.out.println(path2.resolve("E:\\"));//E:\

(4) path 转换

1)将 path 转换为 uri,使用Path.toUri() 方法,Path转换为可以在浏览器中打开的字符串格式,如下:

System.out.format("%s%n", path1.toUri());//file:///E:/book/

2)toAbsolutePath 转换为绝对路径:

System.out.println(path2.toAbsolutePath());//E:\workspace\javass\java\1.txt

3) toFile() 转换为文件

(5)判断文件或目录是否存在:

可以使用方法 exists(Path, LinkOption...) 和 notExists(Path, LinkOption...) 来判断文件/目录是否存在。值得引起注意的一件事是,!Files.exist(path) 并与 Files.exist(path) 等同,因为当你在测试一个文件/目录是否存在时,有可能出现以下三种结果:

    (1)文件/目录 确认存在

    (2)文件/目录 确认不存在

    (3)无法判断文件/目录是否存在,这种情况会出在在程序无权访问指定文件/目录 时。

    当 exists()和 notExists()都返回 false,无法判断指定文件/目录 是否存在。




2.文件目录列表流:DirectoryStream<Path>


在列出目录下的所有文件时,使用File.list ,在子文件或者目录较多是性能比较差。可以使用Java 7 引进的DirectoryStream<Path>。它是渐进式读取文件,每次只读一部分文件。


Path path = Paths.get(".");
try (DirectoryStream<Path> stream = Files.newDirectoryStream(path)) {
	for (Path entry : stream) {
		System.out.println(entry.toString());
	}
}


3.文件目录树遍历



DirectoryStream 只能遍历直接子目录和文件,要递归遍历子目录下的子目录,要使用FileVisitor接口。

接口方法:

1)visitFile(),表示正在访问某个文件;

2)visitFileFailed(),表示访问某个文件时出现了错误。

3)preVisitDirectory(),在访问一个目录中包含的子目录和文件之前被调用。

4)postVisitDirectory(),访问完一个目录的全部子目录中的内容之后调用。


4个方法都返回FileVisitResult枚举类型:


FileVisitResult.CONTINUE表示继续正常的遍历过程

SKIP_SIBLINGS: 表示跳过当前目录或者文件的兄弟节点;

SKIP_SUBTREE: 表示不再遍历当前目录中的内容;


TERMINATE:立即结束整个遍历过程.


public class DemoFileVisitor extends SimpleFileVisitor<Path>{
	
	public FileVisitResult preVisitDirectory(Path dir,BasicFileAttributes attrs){
		System.out.println("准备访问目录:" + dir.toString());
		return FileVisitResult.CONTINUE;
		
	}
	
	public FileVisitResult postVisitDirectory(Path dir , IOException e){
		System.out.println("目录:" + dir.toString() + " 访问完成");
		return FileVisitResult.CONTINUE;
	}
	
	public FileVisitResult visitFile(Path file, BasicFileAttributes attrs){
		System.out.println("正在访问文件:" + file.getFileName());
		return FileVisitResult.CONTINUE;
	}
	
	public static void main(String[] args) throws IOException{
		DemoFileVisitor dfv = new DemoFileVisitor();
		Files.walkFileTree(Paths.get("."), dfv);
	}

}






4.监视目录变化

java 7 提供了监视目录变化服务,使用该服务可以指定目录中内容的创建,修改和删除的事件通知。


public static void watchFile() throws IOException, InterruptedException {
		
		WatchService service = FileSystems.getDefault().newWatchService();//创建监视服务
		
		Path path = Paths.get("").toAbsolutePath();
		//注册监视服务,监视create 和修改事件
		path.register(service, StandardWatchEventKinds.ENTRY_CREATE,
				StandardWatchEventKinds.ENTRY_MODIFY);
		System.out.println("watch path :" + path.toString());
		boolean flag = true;
		while (flag) {
			//通过watchkey 获得事件通知
			WatchKey key = service.take();
			for (WatchEvent<?> event : key.pollEvents()) {
				Path createdPath = (Path) event.context();
				createdPath = path.resolve(createdPath);
				long size = Files.size(createdPath);
				System.out.println(createdPath + " ==> " + size);
				flag = false;
			}
		}
	}








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值