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; import java.util.Date; public class FIter2 { public static void main(String[] args) throws IOException { System.out.println("java.io.File iteration"); Info info = null; long t = 0; nioIter(args[0], new Info()); t = 0; System.out.println("------------------"); 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(" nio.totalSize:" + info.size); System.out.println(" fileNum:" + info.num); System.out.println(" checkSum:" + info.csum); System.out.println(" Time:" + t/10); // fs warmup ioIter(new File[] { new File(args[0])}, new Info()); System.out.println("------------------"); 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(" 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()); System.out.println("------------------"); 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(" io2.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(); info.csum += javaToDosTime(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(); info.csum += javaToDosTime(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.csum += javaToDosTime(attrs.lastModifiedTime().toMillis()); info.num++; return FileVisitResult.CONTINUE; } @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) { info.num++; //info.csum += attrs.lastModifiedTime().toMillis(); info.csum += javaToDosTime(attrs.lastModifiedTime().toMillis()); return FileVisitResult.CONTINUE; } }); } private static long javaToDosTime(long time) { Date d = new Date(time); int year = d.getYear() + 1900; if (year < 1980) { return (1 << 21) | (1 << 16); } return (year - 1980) << 25 | (d.getMonth() + 1) << 21 | d.getDate() << 16 | d.getHours() << 11 | d.getMinutes() << 5 | d.getSeconds() >> 1; } }