简单的文件遍历 发表于 2017-09-13 | 分类于 java | 分别使用java中的io和nio遍历文件系统 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283package org.zero.example.nio;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;public class FileExplorer { public static void main(String[] args) throws IOException { String uri = "D:\\apps"; walkFileTree(uri); System.out.println("\n*****************************************************"); showDirFiles(uri); } /** * @param uri 需要遍历的文件系统根目录 */ private static void showDirFiles(String uri) { _walkDirFiles(new File(uri), 0); } /** * 使用简单的文件访问,递归遍历 file路径下的所有目录及文件 * @param file * @param level */ private static void _walkDirFiles(File file, int level) { for(int i=0; i<level; i++) { System.out.print("\t|"); } System.out.println(file.getName()); if(file.isDirectory()) { for(File temp : file.listFiles()) { _walkDirFiles(temp, level + 1); } } } /** * 使用nio包遍历文件系统 * @param uri 需要遍历的文件系统根目录 */ public static void walkFileTree(String uri) throws IOException { Path path = Paths.get(uri); // 当前 uri在文件系统中的深度 final int rootdeep = getLevelByPath(path); Files.walkFileTree(path, new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { // 当前遍历的文件在文件系统中的深度 int level = getLevelByPath(file) - rootdeep; for(int i=0; i<level; i++) { System.out.print("\t|"); } System.out.println(file.getFileName().toString()); return super.visitFile(file, attrs); } @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { int level = getLevelByPath(dir) - rootdeep; for(int i=0; i<level; i++) { System.out.print("\t|"); } System.out.println(dir.getFileName().toString()); return super.preVisitDirectory(dir, attrs); } }); } private static int getLevelByPath(Path path) { String separator = File.separator; if("\\".equals(separator)) { // windows下的 \ 需特殊处理 separator = "\\\\"; } return path.toString().split(separator).length - 1; }}