class MyFileVisitor extends SimpleFileVisitor {
public FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs) throws IOException {
}
public FileVisitResult visitFile(T file, BasicFileAttributes attrs) throws IOException {
}
public FileVisitResult visitFileFailed(T file, IOException exc) throws IOException {
}
public FileVisitResult postVisitDirectory(T dir, IOException exc) throws IOException {
}
}
این کلاس یک Generic data type به اسم T داره که باید به Path تغییرش بدیم. و چهار تا متدش رو overide می کنیم و Generic data type اونها رو هم به Path تغییر میدیم و برای همهشون مقدار CONTINUE رو از کلاس enumی به نام FileVisitResult بر می گردونیم. و توی هر کدام از متدها System.out.print میکنیم که مرور# در چه وضعیتی قرار داره.
class MyFileVisitor extends SimpleFileVisitor {
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
System.out.println("Started: " + dir);
return FileVisitResult.CONTINUE;
}
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
if(attrs.isRegularFile()) {
System.out.print("File: ");
}
System.out.println(file);
return FileVisitResult.CONTINUE;
}
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
System.err.println("visiting falied!");
return FileVisitResult.CONTINUE;
}
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
System.out.println("Finished: " + dir);
return FileVisitResult.CONTINUE;
}
}
preVisitDirectory قبل از مرور# پوشه# جدید فراخونی میشه.
postVisitDirecoty وقتی مرور پوشه تموم شد فراخونی میشه.
visitFile وقتی یه فایل# ملاقات میشه فراخونی میشه که به این متد یک شی از نوع BasicFileAttributes فرستاده میشه که اگه فایل مرور شده یه فایل معمولی باشه تابع isRegularFile مقدار true رو بر می گردونه.
visitFileFailed هم در صورت به وجود اومدن مشکل در مرور، فراخونی میشه.
خب حالا نوبت به استفاده از این Visitor سفارشی میرسه.
برای استفاده (احتمالا توی متد main تو یه کلاس دیگه) اول باید موقعیتی رو که می خوایم مرور کنیم رو تعریف کنیم. اینطوری:
Path toVisit = Paths.get("dirToVisit");
یه شی از کلاس سفارشی میسازیم.
MyFileVisitor visitor = new MyFileVisitor();
حالا متد walkFileTree از کلاس Files رو صدا میزنیم که البته یه متد static هست.
Files.walkFileTree(toVisit, visitor);
برچسب:
نویسنده: پارسا کاظمیان