Kode efisien bijaksana, adalah apa yang Anda maksud saya berharap, tidak CPU bijaksana
mkoryak
3
Dia tidak bertanya bagaimana melakukannya, dia bertanya apa cara yang paling efisien. Saya datang ke sini mencari hal yang sama.
Edward Falk
Jawaban:
285
Ini adalah semacam kode yang tidak seharusnya kita lakukan sendiri. Gunakan perpustakaan untuk hal-hal duniawi, selamatkan otakmu untuk hal-hal yang sulit.
Untuk 95% proyek, ini harus menjadi jawaban yang diterima. Menulis ulang kode seperti ini adalah penyebab utama banyak sakit kepala!
Carsten Hoffmann
1
Cukup tambahkan baris berikut dalam gradle untuk menambahkan dependensi: - kompilasi 'commons-io: commons-io: 2.6'
Deepak Sharma
contoh tolong.
john ktejik
8
Jika Anda sudah memiliki Apache Commons I / O di proyek Anda, itu benar. Tetapi jika ini yang Anda butuhkan dari itu, Anda menambahkan (setidaknya) 2,5 MB bobot mati untuk proyek Anda untuk sesuatu yang dapat dengan mudah dilakukan dengan satu baris.
if (str! = null && str.contains (".")) str.substring (0, str.lastIndexOf ('.')). FilenameUtils adalah ketergantungan lain, dan tidak selalu tersedia
ocramot
88
Karena menggunakan String.substringdan String.lastIndexdalam satu-liner itu baik, ada beberapa masalah dalam hal dapat mengatasi jalur file tertentu.
Ambil contoh jalur berikut:
a.b/c
Menggunakan one-liner akan menghasilkan:
a
Itu tidak benar.
Hasilnya seharusnya c, tetapi karena file tidak memiliki ekstensi, tetapi path memiliki direktori dengan .nama, metode one-liner diperdaya untuk memberikan bagian dari path sebagai nama file, yang tidak benar.
Untuk menciptakan kembali perilakunya, saya menulis beberapa tes yang harus dipenuhi oleh metode baru, yaitu:
Path Nama file
-------------- --------
a / b / cc
a / b / c.jpg c
a / b / c.jpg.jpg c.jpg
ab / cc
ab / c.jpg c
ab / c.jpg.jpg c.jpg
cc
c.jpg c
c.jpg.jpg c.jpg
(Dan hanya itu yang sudah saya periksa - mungkin ada cek lain yang seharusnya ada di tempat yang saya abaikan.)
Pelaksanaan
Berikut ini adalah implementasi saya untuk removeExtensionmetode ini:
Menjalankan removeExtensionmetode ini dengan tes di atas menghasilkan hasil yang tercantum di atas.
Metode ini diuji dengan kode berikut. Karena ini dijalankan pada Windows, pemisah jalur adalah \yang harus diloloskan dengan \ketika digunakan sebagai bagian dari suatu Stringliteral.
Tidak, mungkin ada lebih dari satu '.'; Anda ingin lastIndexOf ('.')
Adam Jaskiewicz
-1 karena tidak menggunakan metode yang saya pikir Anda gunakan. Itu sekarang total +0 dari saya. Ubah dengan cepat! ;)
Michael Myers
7
String fileName="foo.bar";int dotIndex=fileName.lastIndexOf('.');if(dotIndex>=0){// to prevent exception if there is no dot
fileName=fileName.substring(0,dotIndex);}
Gunakan metode di com.google.common.io.Fileskelas jika proyek Anda sudah bergantung pada pustaka inti Google. Metode yang Anda butuhkan adalah getNameWithoutExtension.
Ini akan mengubah "a.jpg.jpg" menjadi "a" alih-alih (benar) "a.jpg". Apa tujuan melayani file.length() > 0cek?
Klaus Gütter
Pertanyaan utama adalah "bagaimana menghapus ekstensi?", Jadi ya itu mengubah "a.txt.zip" menjadi "a" dan ".htaccess" menjadi kekosongan. Fungsi ini bekerja dengan Strings, jadi nama file bisa tidak nol tetapi masih bisa 0 panjang, lebih cepat periksa apakah layak sebelum parsing simbol. Salam.
Jawaban:
Ini adalah semacam kode yang tidak seharusnya kita lakukan sendiri. Gunakan perpustakaan untuk hal-hal duniawi, selamatkan otakmu untuk hal-hal yang sulit.
Dalam hal ini, saya sarankan menggunakan FilenameUtils.removeExtension () dari Apache Commons IO
sumber
sumber
if(str.contains("."))
str.substring(0, str.lastIndexOf('.'))
Karena menggunakan
String.substring
danString.lastIndex
dalam satu-liner itu baik, ada beberapa masalah dalam hal dapat mengatasi jalur file tertentu.Ambil contoh jalur berikut:
Menggunakan one-liner akan menghasilkan:
Itu tidak benar.
Hasilnya seharusnya
c
, tetapi karena file tidak memiliki ekstensi, tetapi path memiliki direktori dengan.
nama, metode one-liner diperdaya untuk memberikan bagian dari path sebagai nama file, yang tidak benar.Perlu cek
Terinspirasi oleh jawaban skaffman , saya melihat
FilenameUtils.removeExtension
metode Apache Commons IO .Untuk menciptakan kembali perilakunya, saya menulis beberapa tes yang harus dipenuhi oleh metode baru, yaitu:
(Dan hanya itu yang sudah saya periksa - mungkin ada cek lain yang seharusnya ada di tempat yang saya abaikan.)
Pelaksanaan
Berikut ini adalah implementasi saya untuk
removeExtension
metode ini:Menjalankan
removeExtension
metode ini dengan tes di atas menghasilkan hasil yang tercantum di atas.Metode ini diuji dengan kode berikut. Karena ini dijalankan pada Windows, pemisah jalur adalah
\
yang harus diloloskan dengan\
ketika digunakan sebagai bagian dari suatuString
literal.Hasilnya adalah:
Hasilnya adalah hasil yang diinginkan yang diuraikan dalam tes yang harus dipenuhi metode ini.
sumber
System.getProperty("file.separator")
dan bukan hanyaFile.separator
?/path/to/.htaccess
BTW, dalam kasus saya, ketika saya menginginkan solusi cepat untuk menghapus ekstensi tertentu, ini kira-kira yang saya lakukan:
sumber
sumber
Apakah ini pertanyaan jebakan? : p
Saya tidak bisa memikirkan cara yang lebih cepat.
sumber
Gunakan metode di
com.google.common.io.Files
kelas jika proyek Anda sudah bergantung pada pustaka inti Google. Metode yang Anda butuhkan adalahgetNameWithoutExtension
.sumber
Anda dapat mencoba fungsi ini, sangat mendasar
sumber
Saya menemukan jawaban coolbird sangat berguna.
Tapi saya mengubah pernyataan hasil terakhir menjadi:
karena saya ingin nama path lengkap dikembalikan.
sumber
sumber
Gunakan regex. Yang ini menggantikan titik terakhir, dan semuanya setelahnya.
Anda juga dapat membuat objek Pola jika Anda ingin mengkompilasi regex.
sumber
sumber
"\\."
sebagai "." khusus untuk regex.buat file baru dengan jalur gambar string
sumber
org.apache.commons.io.FilenameUtils versi 2.4 memberikan jawaban berikut
sumber
sumber
Saya akan melakukan ini:
Mulai dari akhir hingga '.' lalu panggil substring.
Sunting: Mungkin bukan golf tapi ini efektif :)
sumber
Ingat skenario di mana tidak ada ekstensi file atau ada lebih dari satu ekstensi file
contoh Nama file: file | file.txt | file.tar.bz2
sumber
Ini akan menampilkan contoh untuk img dan imgLink
sumber
sumber
file.length() > 0
cek?