Java SimpleFileVisitor遍历文件夹与File遍历文件夹的速度对比

本文通过测试对比发现,使用Java的SimpleFileVisitor遍历文件夹比File类的递归遍历速度快约50%。在SimpleFileVisitor中遇到.dll文件会报错,但通过在visitFileFailed()返回FileVisitResult.CONTINUE可解决此问题。这可能是因为SimpleFileVisitor对系统文件的忽略导致其效率更高。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试对比File类递归与SimpleFileVisitor类遍历文件夹的耗时:

package other;

import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class FilterMp3 {
	private List<File> musicList = new ArrayList<>();
	private List<File> musicList2 = new ArrayList<>();
	private long fLen = 1024*1024*3;
	private String filterD = "D:/";
	//遍历方法1:
	public List<File> getLocalMp3(){
		File[] rootDirectory = new File(filterD).listFiles();
		long start = System.currentTimeMillis();
		System.out.println("开始递归" + start);
		nextDirectory(rootDirectory);
		long end = System.currentTimeMillis();
		System.out.println("结束递归"+ end);
		System.out.println("mp3集合长度:"+musicList.size() + " 耗时:" + (end - start) + "ms");
		return musicList;
	}
	private void nextDirectory(File[] directory){
//		System.out.println("directory:"+ Arrays.toString(directory));
		for(File f : directory){
//			System.out.println(f.getName());
			if(f.isDirectory() && !f.isHidden() && !f.getName().startsWith(".")){
				File[] child = f.listFiles();
				nextDirectory(child);
			}else if(f.getName().endsWith(".mp3") && f.length()>fLen){
				musicList.add(f);
			}
		}
	}
	//遍历方法2:
	private List<File> getMp3FromeFileVisitor() throws IOException{
		long start2 = System.currentTimeMillis();
		Files.walkFileTree(Paths.get(filterD), new SimpleFileVisitor<Path>(){
			@Override
			public FileVisitResult visitFile(Path file,BasicFileAttributes attrs){
				if(file.getFileName().toString().endsWith(".mp3") && attrs.size()>fLen){
					musicList2.add(file.toFile());
//					System.out.println("文件:"+file.toFile().getName());
				}
				return FileVisitResult.CONTINUE;
			}
			@Override
			public FileVisitResult preVisitDirectory(Path dir,BasicFileAttributes attrs){
//				System.out.println("方法2访问文件夹:" + dir);
				return FileVisitResult.CONTINUE;
			}
			@Override
			public FileVisitResult visitFileFailed(Path file,IOException e){
				
				return FileVisitResult.CONTINUE;
			}
		});
		long end2 = System.currentTimeMillis();
		System.out.println("方法2结果:" + musicList2.size()+" " + "用时:" +(end2 - start2) +"ms");
		return musicList2;
	}
	public static void main(String[] args) {
		FilterMp3 fm = new FilterMp3();
		fm.getLocalMp3();
		try {
			fm.getMp3FromeFileVisitor();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

运行结果:SimpleFileVisitor遍历比File遍历快将近50%

开始递归1513145408629
结束递归1513145416589
mp3集合长度:196 耗时:7960ms
方法2结果:196 用时:4157ms

使用SimpleFileVisitor时每次读到.dll文件时就会报错提示“System information……”,在visitFileFailed()中使用return FileVisiResult.CONTINUE之后正常。

之所以SimpleFileVisitor比File快,可能就是SimpleFileVisitor忽略了系统文件吧?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值