Ini harus sangat sederhana. Jika saya memiliki String seperti ini:
../Test?/sample*.txt
lalu apa cara yang diterima secara umum untuk mendapatkan daftar file yang cocok dengan pola ini? (misalnya itu harus cocok ../Test1/sample22b.txt
dan ../Test4/sample-spiffy.txt
tetapi tidak ../Test3/sample2.blah
atau ../Test44/sample2.txt
)
Saya telah melihat org.apache.commons.io.filefilter.WildcardFileFilter
dan sepertinya binatang yang tepat tetapi saya tidak yakin bagaimana menggunakannya untuk menemukan file di jalur direktori relatif.
Saya kira saya bisa mencari sumber semut karena menggunakan sintaks wildcard, tetapi saya harus kehilangan sesuatu yang cukup jelas di sini.
( sunting : contoh di atas hanyalah contoh kasus. Saya sedang mencari cara untuk mem-parsing jalur umum yang berisi wildcard saat runtime. Saya menemukan cara melakukannya berdasarkan saran mmyers tetapi agak menyebalkan. Belum lagi bahwa java JRE tampaknya mem-parsing wildcard sederhana di argumen utama (String []) dari satu argumen untuk "menghemat" waktu dan kerumitan saya ... Saya hanya senang saya tidak memiliki argumen non-file di campuran.)
Jawaban:
Pertimbangkan DirectoryScanner dari Apache Ant:
Anda harus merujuk ant.jar (~ 1.3 MB untuk ant 1.7.1).
sumber
DirectoryScanner
ditemukan di pleksus-utils (241Kb). Yang lebih kecilant.jar
(1.9Mb).ls
dengan pola file yang sama (milidetik menggunakanls <pattern>
vs menit saat menggunakan DirectoryScanner) ...Mencoba
FileUtils
dari Apache commons-io (listFiles
daniterateFiles
metode):Untuk mengatasi masalah Anda dengan
TestX
folder, pertama-tama saya akan mengulangi daftar folder:Solusi yang cukup 'brute force' tetapi harus bekerja dengan baik. Jika ini tidak sesuai dengan kebutuhan Anda, Anda selalu dapat menggunakan RegexFileFilter .
sumber
Berikut adalah contoh daftar file berdasarkan pola yang didukung oleh Java 7 nio globbing dan Java 8 lambdas:
atau
sumber
Files.walk(Paths.get("..")).filter(matcher::matches).forEach(System.out::println);
Anda bisa mengonversi string wildcard Anda menjadi ekspresi reguler dan menggunakannya dengan
matches
metode String . Mengikuti contoh Anda:Ini berfungsi untuk contoh Anda:
Dan contoh tandingan:
sumber
?
boolean statis publik isFileMatchTargetFilePattern (File terakhir f, final String targetPattern) {`` String regex = targetPattern.replace (".", "\\."); `regex = regex.replace("?", ".?").replace("
*", ".
*");
return f.getName().matches(regex);
}
StringBuffer regexBuffer = ...; Matcher matcher = Pattern.compile("(.*?)([*?])").matcher(original); while (matcher.find()) { matcher.appendReplacement(regexBuffer, (Pattern.quote(matcher.group(1)) + (matcher.group(2).equals("*") ? ".*?" : ".?")).replace("\\", "\\\\").replace("$", "\\$")); } matcher.appendTail(regexBuffer);
.
bukan.?
.Karena Java 8 Anda dapat menggunakan
Files#find
metode langsung darijava.nio.file
.Contoh penggunaan
sumber
Mungkin tidak membantu Anda sekarang, tetapi JDK 7 dimaksudkan untuk memiliki pencocokan nama file glob dan regex sebagai bagian dari "Lebih Banyak Fitur NIO".
sumber
Perpustakaan wildcard efisien melakukan pencocokan glob dan regex nama file:
http://code.google.com/p/wildcard/
Implementasinya singkat - JAR hanya 12,9 kilobyte.
sumber
Cara sederhana tanpa menggunakan impor eksternal adalah dengan menggunakan metode ini
Saya membuat file csv dengan nama billing_201208.csv, billing_201209.csv, billing_201210.csv dan sepertinya berfungsi dengan baik.
Output akan menjadi berikut jika file yang tercantum di atas ada
sumber
Seperti yang diposting pada jawaban lain, pustaka wildcard berfungsi untuk pencocokan nama file glob dan regex: http://code.google.com/p/wildcard/
Saya menggunakan kode berikut untuk mencocokkan pola glob termasuk absolut dan relatif pada sistem file gaya * nix:
Saya menghabiskan beberapa waktu mencoba untuk mendapatkan metode FileUtils.listFiles di perpustakaan Apache commons io (lihat jawaban Vladimir) untuk melakukan ini tetapi tidak berhasil (saya sadar sekarang / saya pikir itu hanya dapat menangani pencocokan pola satu direktori atau file pada suatu waktu) .
Selain itu, menggunakan filter regex (lihat jawaban Fabian) untuk memproses pengguna sewenang-wenang memberikan pola glob tipe absolut tanpa mencari seluruh sistem file akan membutuhkan beberapa preprocessing glob yang disediakan untuk menentukan awalan non-regex / glob terbesar.
Tentu saja, Java 7 dapat menangani fungsionalitas yang diminta dengan baik, tetapi sayangnya saya terjebak dengan Java 6 untuk saat ini. Perpustakaan relatif sangat kecil pada ukuran 13.5kb.
Catatan untuk pengulas: Saya berusaha menambahkan jawaban di atas ke jawaban yang ada yang menyebutkan perpustakaan ini tetapi hasil edit ditolak. Saya tidak punya cukup tenaga untuk menambahkan ini sebagai komentar. Apakah tidak ada cara yang lebih baik ...
sumber
Anda harus dapat menggunakan
WildcardFileFilter
. Cukup gunakanSystem.getProperty("user.dir")
untuk mendapatkan direktori kerja. Coba ini:Anda tidak perlu menggantinya
*
dengan[.*]
asumsi menggunakan wildcard filterjava.regex.Pattern
. Saya belum menguji ini, tapi saya menggunakan pola dan filter file terus-menerus.sumber
Glob dari Java7: Mencari File . ( Sampel )
sumber
Filter Apache dibuat untuk melakukan iterasi file dalam direktori yang dikenal. Untuk mengizinkan wildcard dalam direktori juga, Anda harus membagi path pada '
\
' atau '/
' dan melakukan filter pada setiap bagian secara terpisah.sumber
Mengapa tidak menggunakan, lakukan sesuatu seperti:
Maka Anda tidak perlu khawatir tentang jalur relatif dan dapat melakukan wildcarding sesuai kebutuhan.
sumber
Menerapkan antarmuka FileDisitor JDK. Berikut adalah contohnya http://wilddiary.com/list-files-matching-a-naming-pattern-java/
sumber
Metode Util:
Tes jUnit:
Keluaran:
sumber
foo/bar.txt
cocokfoo?bar.txt
dan itu tidak benar../Test?/sample*.txt
sumber