Java7使用FileVisitor遍历文件和目录

Java7使用FileVisitor遍历文件和目录

在以前的Java版本中,如果程序要遍历指定目录下的所有文件和子目录,则只能使用递归进行遍历,但这种方式不仅复杂,而且灵活性也不高。

Java7 提供了Files和Paths 两个工具类,其中Files包含了大量静态的工具方法来操作文件;Paths则包含了两个返回Path的静态工厂方法。

有了Files工具类的帮助,现在可以用更优雅的方式来遍历文件和子目录。Files类提供了如下两个方法来遍历文件和子目录。

//遍历start路径下的所有文件和子目录
public static Path walkFileTree(Path start, FileVisitor<? super Path> visitor)

//与上一个方法功能类似,该方法最多遍历maxDepth深度的文件
public static Path walkFileTree(Path start,
                                    Set<FileVisitOption> options,
                                    int maxDepth,
                                    FileVisitor<? super Path> visitor)

上面两个方法都需要FileVisitor参数,FileVisitor代表一个文件访问器,walkFileTree()方法会自动遍历start路径下的所有文件和子目录,遍历文件和子目录都会“触发”FileVisitor中相应的方法。

FileVisitor中定义的4个方法

//访问子目录之前触发该方法
public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs)
//访问文件时触发该方法
public FileVisitResult visitFile(Object file, BasicFileAttributes attrs)
//访问文件失败时触发该方法
public FileVisitResult visitFileFailed(Object file, IOException exc)
//访问子目录之后触发该方法
public FileVisitResult postVisitDirectory(Object dir, IOException exc)

 

上面的4个方法都返回一个FileVisitResult,它是一个枚举类,代表访问之后的后续行为

CONTINUE:代表“继续访问”的后续行为

TERMINATE:代表“终止访问”的后续行为

SKIP_SUBTREE:代表“继续访问“,但不访问该目录文件或目录的子目录

SKIP_SIBLINGS:代表“继续访问”,但不访问该文件或目录的兄弟文件或目录

其实在实际使用中,没有必要实现FileVisitor中的4个方法,可以通过继承SimpleFileVisitor(FileVisitor的实现类),根据需要选择性的重写其中的方法。

使用FileVisitor遍历文件和子目录

    @SuppressWarnings("unchecked")
	public static void main(String[] args) {
		
		try {
			
			Files.walkFileTree(Paths.get("D:/GitHub/Git"), new SimpleFileVisitor(){
				
				//访问子目录之前触发该方法
				@Override
				public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs) 
throws IOException {
					
					System.out.println("正在访问: "+dir+" 路径");
					return FileVisitResult.CONTINUE;
				}
				
				//访问文件时触发该方法
				@Override
				public FileVisitResult visitFile(Object file, BasicFileAttributes attrs) 
throws IOException {
					
					System.out.println("正在访问: "+file+" 文件");
					return FileVisitResult.CONTINUE;
				}
				
				//访问文件失败时触发该方法
				@Override
				public FileVisitResult visitFileFailed(Object file, IOException exc) 
throws IOException {
					
					System.out.println("访问 "+file+"  文件失败");
					return FileVisitResult.CONTINUE;
				}
				
				//访问子目录之后触发该方法
				@Override
				public FileVisitResult postVisitDirectory(Object dir, IOException exc) 
throws IOException {
					return FileVisitResult.CONTINUE;
				}
				
			});
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}


 

转载于:https://my.oschina.net/u/2601381/blog/739932

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值