Karena tidak menemukan deskripsi penjelasan dalam bahasa Rusia di mana saja, apa
jenis beast
Files.walkFileTree () , dan setelah menguasainya dengan mencicit, ternyata nanti, fungsionalitas yang sederhana, saya memutuskan untuk membagikan materi dengan contoh-contoh sebagai bagian dari penjepitan, yang sangat saya lewatkan.
Metode walkFileTree () memungkinkan Anda untuk memintas pohon file dan subdirektori yang diteruskan sebagai parameter elemen Path ...
Dua tanda tangan metodeFiles.walkFileTree(Path start, FileVisitor<? super Path> visitor); Files.walkFileTree(Path start, Set<FileVisitOption> options, int maxDepth, FileVisitor<? super Path> visitor);
Dimana
Path start - direktori yang isinya harus dilewati,
Pengunjung FileVisitor - turunan dari kelas yang mengimplementasikan antarmuka FileVisitor, atau mewarisi dari SimpleFileVisitor (). Yang terakhir, menurut pendapat saya, lebih nyaman digunakan ketika Anda tidak perlu mendefinisikan kembali semua metode FileVisitor (), yang akan dibahas sedikit kemudian (tetapi tergantung pada situasinya),
Setel opsi <\ FileVisitOption> - serangkaian opsi yang menentukan perilaku saat merayapi,
maxDepth - kedalaman lintas subdirektori.
Pertama, tentang parameter yang akan berguna cepat atau lambat.maxDepth - kedalaman traversal. Pada = 0, entri ke direktori tidak akan dilakukan, pada = MAX_VALUE direktori akan diperiksa ke kedalaman maksimum, masing-masing, dengan maxDepth = 3, bagian akan dilakukan dalam 3 subdirektori "turun".
FileVisitOption - enum adalah set yang menentukan apakah program harus mengikuti tautan simbolis saat merayapi (dalam hal ini, nilai FileVisitOption.FOLLOW_LINKS ditentukan).
FileVisitor - antarmuka yang memiliki 4 metode:
1) FileVisitResult preVisitDirectory (Direktori, BasicFileAttributes attrs) melempar IOException;termasuk serangkaian metode yang harus diikuti sebelum mengunjungi subdirektori saat ini. Misalnya, melalui attrs Anda bisa dapatkan dari data seperti:
lastModifiedTime (),
lastAccessTime (),
creationTime (),
isRegularFile () - true jika kita memiliki file di depan kita,
isDirectory () - true jika kita memiliki direktori
isSymbolicLink () - true jika objek adalah tautan,
isOther () - true jika objek yang dimaksud bukan file, atau direktori, atau tautan,
size () - mengembalikan ukuran objek dan
fileKey () - mengembalikan kunci file atau null;
Jika Anda berencana untuk menghitung jumlah direktori selama perayapan, jangan lupa bahwa direktori awal juga akan diperhitungkan dalam jumlah total.
2) FileVisitResult visitFile (file T, BasicFileAttributes attrs) melempar IOException;seperangkat metode yang harus diikuti saat mengunjungi file saat ini (misalnya, Anda dapat menggali isinya dan mencari kemunculan string pencarian, atau lagi mencari tahu tanggal kunjungan terakhir, mengubah file, atau menambahkan ukuran semua file yang akan dijelajahi untuk mendapatkan ukuran direktori)
Contoh public class MyFileVisitor extends SimpleFileVisitor<Path> { String partOfName; String partOfContent; @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { boolean containsName = true; if(partOfName!=null && !file.getFileName().toString().contains(partOfName)) containsName = false; String content = new String(Files.readAllBytes(file)); boolean containsContent = true; if(partOfContent!=null && !content.contains(partOfContent)) containsContent = false; if(containsName && containsContent) foundFiles.add(file); return FileVisitResult.CONTINUE; }
Dalam contoh ini, saat melintasi hierarki file, setiap file diperiksa untuk eksekusi simultan 2 peristiwa - apakah nama file berisi entri yang diinginkan, dan apakah file tersebut berisi entri dari string yang diperlukan. Ketika kedua kondisi terpenuhi, file ditambahkan ke lembar yang dihasilkan, setelah itu perayapan berlanjut;
Atau
contoh lain
dari kelebihan metode visitFile
@Override public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException { if(path.toString().endsWith(".rar") || path.toString().endsWith(".zip")) archived.add(path.toString()); return FileVisitResult.CONTINUE; }
Program selama traversal pohon ketika mengunjungi file, jika itu adalah zip atau arsip rar, menambahkan alamatnya (path) sebagai string ke daftar file arsip;
3) FileVisitResult visitFileFailed (file T, IOException exc) melempar IOException;Metode ini mungkin berguna ketika mengakses file tidak berhasil + itu "mampu" melempar Pengecualian. Sisanya dapat diajarkan melalui anotasi Override. Misalnya, hitung jumlah file yang tidak dapat diakses;
Contoh @Override public FileVisitResult visitFileFailed(Path path, IOException exc) throws IOException { failed.add(path.toString()); return FileVisitResult.SKIP_SUBTREE; }
Dalam kasus upaya yang gagal untuk mengakses jalur, jalur ini ditambahkan sebagai string ke daftar gagal yang serupa, dan program terus memotong tanpa mengunjungi subdirektori nya;
4) FileVisitResult postVisitDirectory (T dir, IOException exc) melempar IOException;segala sesuatu yang perlu dilakukan setelah mengunjungi direktori harus terdaftar sebagai bagian dari kelebihan metode ini. Sebagai contoh, dengan pergi melalui direktori dan menghancurkan semua file di dalamnya, metode ini juga dapat menghancurkannya sendiri (kita ingat bahwa Files.delete (Path dir) menghapus direktori hanya jika itu kosong dan tidak berisi file).
Contoh @Override public FileVisitResult postVisitDirectory(Path path, IOException exc) throws IOException { Files.delete(path); return FileVisitResult.CONTINUE; }
Semua metode yang dijelaskan di atas diselesaikan dengan mengembalikan "hasil kunjungan" (FileVisitResult) dari objek milik set enum dan dapat mengambil nilai-nilai berikut:
CONTINUE
- terus melintasi pohon;TERMINATE
- mengakhiri traversal pohon;SKIP_SUBTREE
- terus memotong, tanpa pergi ke direktori ini;SKIP_SIBLINGS
- mengecualikan dari merayapi "kerabat" dari file atau direktori ini;