記事ディレクトリ
1. Files.walkFileTree() はファイルを走査します
walkFileTree()
ディレクトリ ツリーを再帰的に走査するためのメソッドが含まれています。メソッド パラメータは Path オブジェクトとオブジェクトを受け取りますFileVisitor
。Path オブジェクトは、走査する必要があるディレクトリを指し、FileVisitor
走査中に呼び出されます。FileVisitor
インターフェースは次のように定義されます。
public interface FileVisitor {
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException;
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException;
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException;
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
}
使用時に実装する必要があるFileVisitor
インターフェース
try {
Files.walkFileTree(start, new FileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
System.out.println("pre visit dir:" + dir);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("visit file:" + file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
System.out.println("visit file failed:" + file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
System.out.println("post visit dir:" + dir);
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
e.printStackTrace();
}
出力:
pre visit dir:C:\Z_WORK\develop\1_GitHub\MyJava\nio-tutorial\nio-exam\target\classes\data
visit file:C:\Z_WORK\develop\1_GitHub\MyJava\nio-tutorial\nio-exam\target\classes\data\nio-data-to.txt
visit file:C:\Z_WORK\develop\1_GitHub\MyJava\nio-tutorial\nio-exam\target\classes\data\nio-data.txt
post visit dir:C:\Z_WORK\develop\1_GitHub\MyJava\nio-tutorial\nio-exam\target\classes\data
FileVisitor
インターフェイス内のメソッドはさまざまなタイミングで呼び出されます。
- preVisitDirectory(): ディレクトリにアクセスする前に呼び出されます。
- postVisitDirectory(): 任意のディレクトリへのアクセスが完了した後に呼び出されます。
- visitFile(): 各ファイルがアクセスされるときに呼び出されます。
- visitFileFaild(): ファイルへのアクセスが失敗したときに呼び出されます。
FileVistResult
4 つのメソッドはすべて、次の 4 つのオプションを含む列挙型のインスタンスを返しますFileVistResult
。
- CONTINUE: 横断を続けます。
- TERMINATE: トラバースを直ちに終了します。
- SKIP_SIBLINGS: 現在のディレクトリ内の兄弟ファイルをスキップして、トラバースを続行します。
- SKIP_SUBTREE: 現在のディレクトリをスキップして、トラバースを続行します。これは、preVisitDirectory() メソッドでのみ返されます。他のメソッドで返された場合は、CONTINUE と同じ効果があります。
2. walkFileTree を使用してファイル取得を実装する
private static void extracted4() {
Path start = Paths.get("D:/test");
try {
Files.walkFileTree(start, new SimpleFileVisitor<Path>(){
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
String filePath = file.toAbsolutePath().toString();
if(filePath.endsWith("test1.txt")){
System.out.println("file found at path:" + filePath);
return FileVisitResult.CONTINUE;
}
return super.visitFile(file, attrs);
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
3. walkFileTree を使用してディレクトリを再帰的に削除する
walkFileTree
ディレクトリとディレクトリ内のすべてのファイルを再帰的に削除するためにも使用できます。削除できるのはFiles.delete()
空のディレクトリまたはファイルのみです。ディレクトリにファイルが含まれている場合、直接削除することはできません。ディレクトリは、ディレクトリ内のすべてのファイルを削除した後にのみ削除できます。walkFileTree
メソッド. ファイル内でディレクトリを削除しisitFile()
、その後、postVisitDirectory()
ディレクトリを再帰的に削除できます。
Path start = Paths.get("D:/test/io");
try {
Files.walkFileTree(start, new SimpleFileVisitor<Path>(){
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("delete file:" + file);
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
System.out.println("delete dir:" + dir);
Files.delete(dir);
return FileVisitResult.CONTINUE;
}
});
} catch (IOException e) {
e.printStackTrace();
}
}