Saya mencari cara untuk mendapatkan daftar semua nama sumber daya dari direktori classpath yang diberikan, sesuatu seperti metode List<String> getResourceNames (String directoryName)
.
Sebagai contoh, diberikan sebuah direktori classpath x/y/z
yang berisi file a.html
, b.html
, c.html
dan subdirektori d
, getResourceNames("x/y/z")
harus kembali List<String>
mengandung string berikut:['a.html', 'b.html', 'c.html', 'd']
.
Ini harus bekerja baik untuk sumber daya dalam sistem file dan stoples.
Saya tahu bahwa saya dapat menulis cuplikan singkat dengan File
s, JarFile
s dan URL
s, tetapi saya tidak ingin menemukan kembali kemudi. Pertanyaan saya adalah, mengingat perpustakaan yang ada tersedia untuk umum, apa cara tercepat untuk mengimplementasikan getResourceNames
? Tumpukan Spring dan Apache Commons keduanya layak.
Jawaban:
Pemindai Khusus
Terapkan pemindai Anda sendiri. Sebagai contoh:
Kerangka Pegas
Gunakan
PathMatchingResourcePatternResolver
dari Spring Framework.Refleksi Ronmamo
Teknik lain mungkin lambat saat runtime untuk nilai CLASSPATH besar. Solusi yang lebih cepat adalah dengan menggunakan Reflection API ronmamo , yang mengompilasi pencarian pada waktu kompilasi.
sumber
new Reflections("my.package", new ResourcesScanner()).getResources(pattern)
getResourceAsStream()
dengan jalur relatif ke direktori mengarah ke FileInputStream (File), yang didefinisikan untuk melempar FileNotFoundException jika file tersebut adalah direktori.Berikut adalah kode
Sumber : forums.devx.com/showthread.php?t=153784
Jika Anda menggunakan Spring Lihatlah PathMatchingResourcePatternResolver
sumber
File.pathSeparator
alih-alih kode-keras:
digetResources
metode.final String[] classPathElements = classPath.split(System.pathSeparator);
Menggunakan Refleksi
Dapatkan semua yang ada di classpath:
Contoh lain - dapatkan semua file dengan ekstensi .csv dari some.package :
sumber
Jika Anda menggunakan apache commonsIO, Anda dapat menggunakan sistem file (opsional dengan filter ekstensi):
dan untuk sumber daya / classpath:
Jika Anda tidak tahu apakah "directoy /" ada di sistem file atau sumber daya, Anda dapat menambahkan
atau
sebelum panggilan dan gunakan keduanya dalam kombinasi ...
sumber
Jadi dalam hal PathMatchingResourcePatternResolver inilah yang diperlukan dalam kode:
sumber
classpath*:config/*.xml
The
Spring framework
'sPathMatchingResourcePatternResolver
benar-benar mengagumkan untuk hal-hal ini:Ketergantungan maven:
sumber
Menggunakan kombinasi respons Rob.
sumber
/' or
.` atau./
tidak ada yang benar-benar berfungsiDengan Spring itu mudah. Baik itu file, folder, atau bahkan banyak file, ada kemungkinan, Anda bisa melakukannya melalui injeksi.
Contoh ini menunjukkan injeksi beberapa file yang terletak di
x/y/z
folder.Itu bekerja untuk sumber daya di sistem file maupun di JAR.
sumber
Ini harus berfungsi (jika pegas bukan opsi):
sumber
Cara saya, tanpa Spring, digunakan selama unit test:
sumber
Mekanisme yang paling kuat untuk mendaftarkan semua sumber daya di classpath saat ini adalah untuk menggunakan pola ini dengan ClassGraph , karena menangani array seluas mungkin dari mekanisme spesifikasi classpath , termasuk sistem modul JPMS yang baru. (Saya penulis ClassGraph.)
sumber
Saya pikir Anda dapat memanfaatkan [ Penyedia Sistem File Zip ] [1] untuk mencapai ini. Ketika menggunakan
FileSystems.newFileSystem
sepertinya Anda bisa memperlakukan objek dalam ZIP itu sebagai file "biasa".Dalam dokumentasi tertaut di atas:
Dokumentasi untuk
jdk.zipfs
modul di [Jawa 11 negara] [5]:Ini adalah contoh yang dibuat-buat yang saya lakukan menggunakan sumber daya contoh Anda. Perhatikan bahwa a
.zip
adalah a.jar
, tetapi Anda dapat mengadaptasi kode Anda untuk menggunakan sumber daya classpath:Mempersiapkan
Jawa
Keluaran
sumber
Tidak ada jawaban yang bekerja untuk saya walaupun sumber daya saya dimasukkan ke dalam folder sumber daya dan mengikuti jawaban di atas. Yang membuat tipuan adalah:
sumber
Berdasarkan informasi @rob di atas, saya membuat implementasi yang saya rilis ke domain publik:
Walaupun saya tidak akan berharap
getResourcesAsStream
untuk bekerja seperti itu pada direktori, itu benar-benar berfungsi dan bekerja dengan baik.sumber