1.本文着重讲述WalkPathTree这个遍历方法
对于文件的遍历可以使用Files工具类中的walkFileTree(Path, FileVisitor)方法,其中需要传入两个参数
- Path:文件起始路径
- FileVisitor:文件访问器,使用访问者模式
- 接口的实现类SimpleFileVisitor有四个方法
- preVisitDirectory:访问目录前的操作
- visitFile:访问文件的操作
- visitFileFailed:访问文件失败时的操作
- postVisitDirectory:访问目录后的操作
- 接口的实现类SimpleFileVisitor有四个方法
2.对文件的基本操作
- 1.删除,如果直接调用Files.delete则会报错,无法对文件进行删除操作,这时候可以运用Files.walkFileTree的方法,拿到SimpleFileVisitor匿名内部类,进行遍历,对每一个目录下的文件进行删除
package netty.io; import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; public class WalkFileTreeDelete { public static void main(String[] args) throws IOException { // Files.delete(Paths.get("D:\\QMDownload"));//报错 Files.walkFileTree(Paths.get("D:\\QMDownload"),new SimpleFileVisitor<Path>(){ @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { Files.delete(file); return super.visitFile(file, attrs); } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { Files.delete(dir); return super.postVisitDirectory(dir, exc); } }); } }
2.统计该目录下文件名后缀为java的文件有几个,注意不包含此目录,因此需要加一;为什么需要用原子计数而不用int全局计数?因为匿名内部类中为final,因此需要用到原子计数。
package netty.io;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.concurrent.atomic.AtomicInteger;
public class WalkFileTree {
public static void main(String[] args) throws IOException {
AtomicInteger javacount=new AtomicInteger();
Files.walkFileTree(Paths.get("C:\\Users\\IdeaProjects\\SpringCloudTest"),new SimpleFileVisitor<Path>(){
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
if(file.toString().endsWith(".java")){
System.out.println(file);
javacount.incrementAndGet();
}
return super.visitFile(file, attrs);
}
});
System.out.println(javacount);
}
public static void m1() throws IOException {
AtomicInteger dircount=new AtomicInteger();
AtomicInteger Filecount=new AtomicInteger();
Files.walkFileTree(Paths.get("C:\\Users\\IdeaProjects\\SpringCloudTest"),new SimpleFileVisitor<Path>(){
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
System.out.println("------>"+dir);
dircount.incrementAndGet();
return super.preVisitDirectory(dir, attrs);
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("------>"+file);
Filecount.incrementAndGet();
return super.visitFile(file, attrs);
}
});
System.out.println(dircount);
System.out.println(Filecount);
}
}
-
3文件复制
-
package netty.io; import java.io.File; import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttributes; public class WalkCopy { public static void main(String[] args) throws IOException { String source="D:\\zhaopian"; String target="D:\\Program Files\\MATLAB\\R2018b119"; // Files.walk(Paths.get(source)).forEach(path -> { // String targetName=path.toString().replace(source,target); // if(Files.isDirectory(path)){ // try { // Files.createDirectories(Paths.get(targetName)); // } catch (IOException e) { // e.printStackTrace(); // } // } // if(Files.isRegularFile(path)){ // try { // Files.copy(path,Paths.get(targetName)); // } catch (IOException e) { // e.printStackTrace(); // } // } // }); Files.walkFileTree(Paths.get(source),new SimpleFileVisitor<Path>(){ String targetName=source.toString().replace(source,target); @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { if (Files.isDirectory(dir)){ Files.createDirectory(Paths.get(targetName));} return super.preVisitDirectory(dir, attrs); } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { Files.copy(Paths.get(source),Paths.get(target)); return super.visitFile(file, attrs); } // } }); } }