Untuk lebih jelasnya, saya tidak mencari tipe MIME.
Katakanlah saya memiliki input berikut: /path/to/file/foo.txt
Saya ingin cara memecah input ini, khususnya .txt
untuk ekstensi. Apakah ada cara yang dibangun untuk melakukan ini di Jawa? Saya ingin menghindari menulis parser saya sendiri.
"txt"
dari"filename.txt"
karena beberapa platform di suatu tempat mungkin ingin digunakan"filename,txt"
.path.substring(path.lastIndexOf("."));
..... Dan ya .. Mereka pasti tidak menduplikasi sesuatu untuk apa-apa ...".txt"
dari"filename.txt"
, yang mungkin bukan hasil yang diinginkan, dan yang terburuk, gagal denganStringIndexOutOfBoundsException
mengembalikan string kosong jika tidak ada ekstensi.Jawaban:
Dalam hal ini, gunakan FilenameUtils.getExtension dari Apache Commons IO
Berikut adalah contoh cara menggunakannya (Anda dapat menentukan path lengkap atau hanya nama file):
Ketergantungan maven:
DSL Gradle Groovy
Gradle Kotlin DSL
Lainnya https://search.maven.org/artifact/commons-io/commons-io/2.6/jar
sumber
Apakah Anda benar-benar membutuhkan "pengurai" untuk ini?
Dengan asumsi bahwa Anda berurusan dengan nama file sederhana seperti Windows, bukan sesuatu seperti
archive.tar.gz
.Btw, untuk kasus direktori mungkin memiliki '.', Tetapi nama file itu sendiri tidak (seperti
/path/to.a/file
), Anda dapat melakukansumber
i > 0
harus diubah menjadii >= 0
ataui != -1
. Ini menangani nama file seperti.htaccess
.sumber
Jika Anda menggunakan perpustakaan Guava , Anda dapat menggunakan
Files
kelas utilitas. Ini memiliki metode khususgetFileExtension()
,. Contohnya:Selain itu Anda juga dapat memperoleh nama file dengan fungsi yang serupa, getNameWithoutExtension () :
sumber
getFileExtension
sebenarnya ituint dotIndex = fileName.lastIndexOf('.'); return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1)
bukan masalah besar. juga, perhatikan yangFiles
ditandai sebagai "tidak stabil" karena beberapa alasan.Jika di Android, Anda dapat menggunakan ini:
sumber
Untuk mempertimbangkan nama file akun tanpa karakter sebelum titik, Anda harus menggunakan sedikit variasi dari jawaban yang diterima:
sumber
Ini adalah metode yang diuji
Dan uji kasus:
sumber
Saya kotor dan mungkin paling kecil menggunakan String.replaceAll :
Perhatikan bahwa pertama
*
adalah rakus sehingga akan mengambil karakter paling mungkin sejauh mungkin dan kemudian hanya titik terakhir dan ekstensi file akan ditinggalkan.sumber
.replaceAll(".*\\.", "")
kembali ".txt"
jika Anda hanya ingin "txt", buat
path.lastIndexOf(".") + 1
sumber
Seperti yang jelas dari semua jawaban lain, tidak ada fungsi "bawaan" yang memadai. Ini adalah metode yang aman dan sederhana.
sumber
Bagaimana dengan (menggunakan Java 1.5 RegEx):
sumber
Jika Anda berencana untuk menggunakan Apache commons-io, dan hanya ingin memeriksa ekstensi file dan kemudian melakukan beberapa operasi, Anda dapat menggunakan ini , berikut ini cuplikannya:
sumber
Berikut ini adalah satu-liner untuk Java 8.
Ia bekerja sebagai berikut:
sumber
Bagaimana dengan JFileChooser? Ini tidak mudah karena Anda perlu mengurai hasil akhirnya ...
yang merupakan tipe MIME ...
OKE ... Saya lupa bahwa Anda tidak ingin tahu tipe MIME-nya.
Kode menarik di tautan berikut: http://download.oracle.com/javase/tutorial/uiswing/components/filechooser.html
Pertanyaan terkait: Bagaimana cara saya memotong ekstensi file dari sebuah String di Java?
sumber
Berikut adalah metode yang menangani
.tar.gz
dengan benar, bahkan di jalur dengan titik-titik dalam nama direktori:afterLastSlash
dibuat untuk membuat temuanafterLastBackslash
lebih cepat karena tidak perlu mencari seluruh string jika ada beberapa garis miring di dalamnya.Bagian
char[]
dalam aslinyaString
digunakan kembali, menambahkan tidak ada sampah di sana, dan JVM mungkin akan melihat bahwaafterLastSlash
segera sampah untuk meletakkannya di tumpukan, bukan tumpukan .sumber
getExtension
fungsi. Jika nama file pengguna"my zip. don't touch.tar.gz"
maka metode ini akan mengembalikan ekstensi yang salah.ekstensi harus memiliki ".txt" di dalamnya ketika dijalankan.
sumber
Inilah versi dengan Opsional sebagai nilai pengembalian (karena Anda tidak dapat memastikan file memiliki ekstensi) ... juga cek kewarasan ...
sumber
Bagaimana dengan versi REGEX :
atau dengan ekstensi nol yang didukung:
hasil untuk * nix:
path: / root / docs /
name: readme
Extention: txt
untuk windows, parsePath ("c: \ windows \ readme.txt"):
path: c: \ windows \
name: readme
Extention: txt
sumber
sumber
Di sini saya membuat metode kecil (namun tidak aman dan tidak memeriksa banyak kesalahan), tetapi jika hanya Anda yang memprogram program java umum, ini lebih dari cukup untuk menemukan filetype. Ini tidak berfungsi untuk tipe file kompleks, tetapi biasanya tidak digunakan sebanyak itu.
sumber
lastIndexOf
sehingga nama file sepertijohn.smith.report.doc
diperlakukan dengan benar. (2) Anda harus menangani kasus dengan benar ketika tidak ada ekstensi. Metode ini kembaliABC/XYZ
untuk jalur sepertiabc/xyz
, yang tidak masuk akal. Akan lebih masuk akal untuk kembali""
ataunull
. (3) Pemisah file tidak selalu/
.Mendapatkan Ekstensi File dari Nama File
Kredit
sumber
Tanpa menggunakan pustaka apa pun, Anda dapat menggunakan metode String split sebagai berikut:
sumber
Hanya alternatif berbasis ekspresi reguler. Tidak secepat itu, tidak sebagus itu.
sumber
Saya menemukan cara yang lebih baik untuk menemukan ekstensi dengan mencampurkan semua jawaban di atas
sumber
Saya suka kesederhanaan jawaban spektre , dan terhubung dalam salah satu komentarnya adalah tautan ke jawaban lain yang memperbaiki titik-titik di jalur file, pada pertanyaan lain, yang dibuat oleh EboMike .
Tanpa menerapkan semacam API pihak ketiga, saya sarankan:
Sesuatu seperti ini mungkin berguna dalam, katakanlah, salah satu
write
metode ImageIO , di mana format file harus diteruskan.Mengapa menggunakan seluruh API pihak ketiga saat Anda bisa menggunakan DIY?
sumber
Pertanyaan khusus ini memberi saya banyak masalah kemudian saya menemukan solusi yang sangat sederhana untuk masalah ini yang saya posting di sini.
Itu dia.
sumber
coba ini.
sumber
sumber
Java memiliki cara untuk menangani hal ini, di kelas java.nio.file.Files , yang dapat bekerja untuk kebutuhan Anda:
Perhatikan bahwa metode statis ini menggunakan spesifikasi yang ditemukan di sini untuk mengambil "tipe konten," yang dapat bervariasi.
sumber