Jawa direktoridarirekursifCari file
Jawa Selanjutnya, saya akan memperkenalkan contoh program yang secara rekursif mencari file di direktori tertentu, termasuk subdirektorinya, dan mengambil daftar file yang sesuai dengan kriteria pencarian.
Perintah-perintah ini melakukan operasi yang sama dengan perintah UNIX `ls -R` dan perintah Windows `dir /s`.
Selain itu, Anda dapat menentukan * sebagai karakter wildcard dalam nama file yang akan dicari, atau menggunakan ekspresi reguler untuk pencarian Anda.
Sebagai contoh penggunaan, pada kasus berikut, direktori `filelist` dicari secara rekursif, termasuk subdirektorinya, dan diperoleh daftar file dengan ekstensi `.java`.
File[] files = search.listFiles(“C:/filelist/”, “*.java”);
Contoh program
/**
*
*/
kelas publik FileSearch {
publik statis final int TIPE_FILE_ATAU_DIR = 1;
publik statis final int TIPE_FILE = 2;
public static final int TYPE_DIR = 3;
/**
* Dari direktori yang ditentukan [directoryPath],
* Lakukan pencarian rekursif untuk file target [fileName] dan temukan yang cocok
* Mengembalikan daftar objek file.
*
* contoh)
* File[] files =listFiles(“C:/filelist/”, “*.java”);
* Pada contoh di atas, daftar file direktori dicari secara rekursif,
* Mengambil daftar file dengan ekstensi .java.
*
* @param directoryPath Jalur yang mewakili direktori yang akan dicari.
* @param fileName Nama file yang akan dicari
Anda dapat menentukan * sebagai karakter wildcard dalam nama file.
* @return Objek berkas yang sesuai dengan pencarian
*/
public File[] listFiles(String directoryPath, String fileName) {
// Konversi * sebagai karakter wildcard menjadi ekspresi reguler
jika (nama file != null) {
fileName = fileName.replace(“.”, “\\.”);
fileName = fileName.replace(“*”, “.*”);
}
kembalikan listFiles(directoryPath, fileName, TYPE_FILE, true, 0);
}
/**
* Dari direktori yang ditentukan [directoryPath], ekspresi reguler yang ditentukan
* Melakukan pencarian rekursif untuk file target [fileNamePattern],
* Mengembalikan daftar objek file yang cocok.
*
* Selain itu, Anda dapat melakukan pencarian dengan memeriksa apakah tanggal modifikasi file lebih dari jumlah hari yang ditentukan setelah tanggal modifikasi asli.
* Anda dapat menentukan ini.
*
* contoh)
* File[] files =
* listFiles(“C:/filelist/”, “*.java”,TYPE_FILE, true, 2);
* Pada contoh di atas, daftar file direktori dicari secara rekursif dan diperbarui untuk hanya menampilkan file yang diperbarui 7 hari yang lalu atau lebih.
* Mengambil daftar file dengan ekstensi .java.
*
* @param directoryPath Jalur yang mewakili direktori yang akan dicari.
* @param fileNamePattern Nama file yang dicari [ekspresi reguler]
* @param type Objek file yang sesuai ditentukan oleh [type],
* Opsi berikut tersedia:
* TYPE_FILE_OR_DIR... File dan direktori
* TIPE_FILE... File
* TYPE_DIR...Direktori
* @param isRecursive: atur ke true jika Anda ingin melakukan pencarian rekursif.
* @param period Target pencarian adalah file yang tanggal modifikasinya telah terlampaui sejumlah hari yang ditentukan.
* Anda dapat mengkonfigurasi apakah fitur ini diaktifkan atau tidak.
* Jika 0, maka tidak berlaku.
* Jika angkanya 1 atau lebih, file dari jumlah hari yang ditentukan dan seterusnya akan disertakan dalam pencarian.
* Jika -1 atau kurang, file yang lebih lama dari jumlah hari yang ditentukan akan disertakan dalam pencarian.
* @return Objek berkas yang sesuai dengan pencarian
*/
File publik[] listFiles(String directoryPath,
String fileNamePattern, int type,
boolean isRecursive, int period) {
File dir = new File(directoryPath);
jika (!dir.isDirectory()) {
lemparkan IllegalArgumentException baru
(Jalur yang ditentukan oleh argumen [" + dir.getAbsolutePath() +
“"] bukanlah direktori.");
}
File[] files = dir.listFiles();
// Output tersebut
for (int i = 0; i < files.length; i++) {
Filefile = files[i];
addFile(type, fileNamePattern, set, file, period);
// Lakukan pencarian secara rekursif dan, jika itu adalah direktori, tambahkan secara rekursif ke dalam daftar.
jika (isRecursive && file.isDirectory()) {
listFiles(file.getAbsolutePath(), fileNamePattern,
tipe, isRecursive, titik);
}
}
kembalikan (File[]) set.toArray(new File[set.size()]);
}
private void addFile(int type, String match, TreeSet set,
File file, int period) {
saklar (tipe) {
kasus TYPE_FILE:
jika (!file.isFile()) {
kembali;
}
merusak;
kasus TYPE_DIR:
jika (!file.isDirectory()) {
kembali;
}
merusak;
}
jika (match != null && !file.getName().matches(match)) {
kembali;
}
// Jika ada spesifikasi untuk memeriksa apakah sejumlah hari tertentu telah berlalu.
jika (periode != 0) {
// Tanggal modifikasi file
Date lastModifiedDate = new Date(file.lastModified());
String lastModifiedDateStr = new SimpleDateFormat(“yyyyMMdd”)
.format(lastModifiedDate);
// Tanggal yang ditentukan (satu hari dihitung dalam milidetik)
long oneDayTime = 24L * 60L * 60L * 1000L;
jangka waktu panjang = satu hari * Math.abs(periode);
TanggalDesainTanggal =
Tanggal baru(System.currentTimeMillis() – periodTime);
String designatedDateStr = new SimpleDateFormat(“yyyyMMdd”)
.format(tanggal yang ditentukan);
jika (periode > 0) {
jika (lastModifiedDateStr.compareTo(designatedDateStr) < 0) {
kembali;
}
kalau tidak {
jika (lastModifiedDateStr.compareTo(designatedDateStr) > 0) {
kembali;
}
}
}
// Simpan dalam daftar jika semua kondisi terpenuhi
set.add(file);
}
/** Gunakan TreeSet untuk mengurutkan secara alfabetis. */
private TreeSet set = new TreeSet();
/**
* Jika Anda ingin menggunakan instance tersebut lagi setelah membuatnya, gunakan metode ini.
Panggilan perlu diakhiri.
* contoh)
* FileSearch search = new FileSearch();
* File[] f1 = search.listFiles(C:/filelist/”, “*.java”);
* search.clear();
* File[] f2 = search.listFiles(“C:/filelist/”, “*.jsp”);
*/
publik void clear(){
set.clear();
}
}
Hasil eksekusi
Untuk memverifikasi program contoh tersebut, saya membuat direktori bernama `filelist` dan menyiapkan file-file berikut.
Nama file dan tanggal modifikasi akan ditampilkan.
*Perhatikan bahwa tanggal saat ini adalah2007/08/18Mari kita asumsikan demikian.
C:\filelist │ aaa.java 2007/08/18 │ bbb.java 2007/08/18 └─dir ccc.java 2007/07/17 ddd.java 2007/08/18 eee.jpg 2007/08/16
◆Contoh
System.out.println("\n●Dapatkan semua file");
File[] files = search.listFiles(path, null);
printFileList(files);
cari.bersihkan();
System.out.println("\n●Dapatkan file dengan ekstensi .java");
files = search.listFiles(path, “*.java”);
printFileList(files);
cari.bersihkan();
System.out.println("\n●Dapatkan semua file dan direktori");
files = search.listFiles(path, null, search.TYPE_FILE_OR_DIR, true, 0);
printFileList(files);
cari.bersihkan();
System.out.println("\n●Mengambil file yang diperbarui dua hari atau lebih yang lalu dari tanggal saat ini");
files = search.listFiles(path, null, search.TYPE_FILE, true, 2);
printFileList(files);
cari.bersihkan();
System.out.println("\n●Mengambil file yang lebih lama dari 30 hari yang lalu atau lebih awal dari tanggal saat ini");
files = search.listFiles(path, null, search.TYPE_FILE, true, -30);
printFileList(files);
cari.bersihkan();
}
private static void printFileList(File[] files) {
for (int i = 0; i < files.length; i++) {
Filefile = files[i];
System.out.println((i + 1) + “: ” + file);
}
}
◆Hasil keluaran
●Dapatkan semua file 1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir\ccc.java 4: C:\filelist\dir\ddd.java 5: C:\filelist\dir\eee.jpg ●Dapatkan file dengan ekstensi .java 1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir\ccc.java 4: C:\filelist\dir\ddd.java ●Dapatkan semua file dan direktori 1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir 4: C:\filelist\dir\ccc.java 5: C:\filelist\dir\ddd.java 6: C:\filelist\dir\eee.jpg ●Dapatkan file yang diperbarui dari tanggal saat ini, mulai dari 2 hari yang lalu 1: 1: C:\filelist\aaa.java 2: C:\filelist\bbb.java 3: C:\filelist\dir\ddd.java 4: C:\filelist\dir\eee.jpg ●Ambil file yang lebih lama dari 30 hari yang lalu atau lebih awal dari tanggal saat ini 1: C:\filelist\dir\ccc.java
