日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

在JAVA中遍歷目錄下的所有文件,很多人第一個想到的是用File.listFiles方法遞歸. 然而這并不是最好的方法, 這里跟幾個其他的方法做一個對比.


 

  1. 自己寫函數遞歸
  2. google的guava工具包
  3. common io工具包
  4. jdk自帶的nio Files工具類
package test.walkfile;

import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Collection;
import java.util.concurrent.ConcurrentSkipListSet;

import org.Apache.commons.io.FileUtils;
import org.apache.commons.io.filefilter.TrueFileFilter;

import com.google.common.io.Files;

import util.TimeUtil;

public class WalkFile {

	private static final String rootPath = "D:\";

	public static void main(String[] args) throws IOException {
		Collection<File> res = new ConcurrentSkipListSet<>();
		File root = new File(rootPath);

		TimeUtil.timeStart("byFunction");
		byFunction(root, res);
		System.out.println(res.size());
		TimeUtil.timeEnd("byFunction");
		res.clear();

		TimeUtil.timeStart("guavaBreadthFirst");
		guavaBreadthFirst(root, res);
		System.out.println(res.size());
		TimeUtil.timeEnd("guavaBreadthFirst");
		res.clear();

		TimeUtil.timeStart("guavaDepthFirst");
		guavaDepthFirst(root, res);
		System.out.println(res.size());
		TimeUtil.timeEnd("guavaDepthFirst");
		res.clear();

		TimeUtil.timeStart("byCommonio");
		byCommonio(root, res);
		System.out.println(res.size());
		TimeUtil.timeEnd("byCommonio");
		res.clear();

		TimeUtil.timeStart("byJdkFiles");
		byJdkFiles(root, res);
		System.out.println(res.size());
		TimeUtil.timeEnd("byJdkFiles");
		res.clear();

	}

	/**
	 * 自己寫算法遍歷文件.
	 * 
	 * @param root
	 * 根路徑
	 * @param allFiles
	 * 遍歷結果集合
	 */
	private static void byFunction(File root, Collection<File> allFiles) {
		if (root == null || !root.exists()) {
			return;
		}
		if (root.isFile()) {
			allFiles.add(root);
		} else {
			File[] listFiles = root.listFiles();
			if (listFiles != null) {
				for (File childFile : listFiles) {
					byFunction(childFile, allFiles);
				}
			}
		}
	}

	/**
	 * guava 廣度優先遍歷文件.
	 * 
	 * @param root
	 * 根路徑
	 * @param allFiles
	 * 遍歷結果集合
	 */
	private static void guavaBreadthFirst(File root, Collection<File> allFiles) {
		Iterable<File> files = Files.fileTraverser().breadthFirst(root);
		files.forEach(f -> allFiles.add(f));
	}

	/**
	 * guava 深度優先遍歷文件.
	 * 
	 * @param root
	 * 根路徑
	 * @param allFiles
	 * 遍歷結果集合
	 */
	private static void guavaDepthFirst(File root, Collection<File> allFiles) {
		Iterable<File> files = Files.fileTraverser().depthFirstPostOrder(root);
		files.forEach(f -> allFiles.add(f));
	}

	/**
	 * 通過common io工具包遍歷文件.
	 * 
	 * @param root
	 * 根路徑
	 * @param allFiles
	 * 遍歷結果集合
	 */
	private static void byCommonio(File root, Collection<File> allFiles) {
		allFiles.addAll(FileUtils.listFiles(root, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE));
	}

	/**
	 * 通過jdk的nio Files工具類遍歷文件.
	 * 
	 * @param root
	 * 根路徑
	 * @param allFiles
	 * 遍歷結果集合
	 * @throws IOException
	 * IO異常
	 */
	private static void byJdkFiles(File root, Collection<File> allFiles) throws IOException {
		java.nio.file.Files.walkFileTree(root.toPath(), new SimpleFileVisitor<Path>() {
			@Override
			public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
				allFiles.add(file.toFile());
				return super.visitFile(file, attrs);
			}

			@Override
			public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
				return FileVisitResult.CONTINUE;
			}

		});
	}
}

程序執行結果如下:

152058
byFunction:6584 ms
178667
guavaBreadthFirst:5539 ms
178667
guavaDepthFirst:5153 ms
152058
byCommonio:6543 ms
152058
byJdkFiles:2272 ms

執行3次結果統計:

java遍歷文件的幾種方法

3次執行時間

jdk自帶的Files類比自己遞歸節約了: (6443 - 2483)÷6443 = 61%的時間. 有些情況下甚至可以節約80%以上的時間. 所以還有什么理由再去自己寫算法呢?

除了遍歷文件,還有復制文件也是如此. jdk nio的Files工具類用時大概是普通buffer數組方式的1/3, FileChannel和Files差不多一樣快.

當性能想要大幅提高的時候,先去java類庫找有沒有合適的工具類.如果沒有再考慮其他jar包. 另外發現,common的jar包一般性能不是很好, 可能偏重于可靠性, google的工具包要好一些.

分享到:
標簽:java
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定