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.Set; public class FIter { public static void main(String[] args) throws IOException { System.out.println("java.io.File iteration"); Info info = null; long t = 0; // fs warmup ioIter(new File[] { new File(args[0])}, new Info()); for (int i = 0; i < 10; i++) { info = new Info(); long t0 = System.currentTimeMillis(); ioIter(new File[] { new File(args[0])}, info); long t1 = System.currentTimeMillis(); t += (t1 - t0); } System.out.println("------------------"); System.out.println(" io.totalSize:" + info.size); System.out.println(" fileNum:" + info.num); System.out.println(" checkSum:" + info.csum); System.out.println(" Time:" + t/10); ioIter2(null, new String[] { args[0]}, new Info()); for (int i = 0; i < 10; i++) { info = new Info(); long t0 = System.currentTimeMillis(); ioIter2(null, new String[] { args[0]}, info); long t1 = System.currentTimeMillis(); t += (t1 - t0); } System.out.println("------------------"); System.out.println(" io2.totalSize:" + info.size); System.out.println(" fileNum:" + info.num); System.out.println(" checkSum:" + info.csum); System.out.println(" Time:" + t/10); nioIter(args[0], new Info()); t = 0; for (int i = 0; i < 10; i++) { info = new Info(); long t0 = System.currentTimeMillis(); nioIter(args[0], info); long t1 = System.currentTimeMillis(); t += (t1 - t0); } System.out.println("------------------"); System.out.println(" nio.totalSize:" + info.size); System.out.println(" fileNum:" + info.num); System.out.println(" checkSum:" + info.csum); System.out.println(" Time:" + t/10); } static class Info { long size; int num; long csum; } private static void ioIter(File[] files, Info info) { if (files == null) return; for (File f : files) { info.num++; info.csum += f.lastModified(); if (f.isFile()) { info.size += f.length(); } else if (f.isDirectory()) { ioIter(f.listFiles(), info); } else {} // just ignore } } private static void ioIter2(File dir, String[] files, Info info) { if (files == null) return; for (String fn : files) { File f; if (dir == null) { f = new File(fn); } else { f = new File(dir, fn); } info.num++; info.csum += f.lastModified(); if (f.isFile()) { info.size += f.length(); } else if (f.isDirectory()) { ioIter2(f, f.list(), info); } else {} // just ignore } } private static void nioIter(String dir, final Info info) throws IOException { Path path = Paths.get(dir); Files.walkFileTree( path, new SimpleFileVisitor() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { info.size += attrs.size(); info.csum += attrs.lastModifiedTime().toMillis(); info.num++; return FileVisitResult.CONTINUE; } @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) { info.num++; info.csum += attrs.lastModifiedTime().toMillis(); return FileVisitResult.CONTINUE; } }); } }