Bagaimana saya mendapatkan ekstensi file dari suatu file di Java?

484

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 .txtuntuk ekstensi. Apakah ada cara yang dibangun untuk melakukan ini di Jawa? Saya ingin menghindari menulis parser saya sendiri.

longda
sumber
12
Anda tidak pernah tahu kapan beberapa platform baru akan hadir yang mendefinisikan ekstensi sebagai dipisahkan oleh koma. Sekarang Anda perlu menulis kode ketergantungan platform. Kerangka kerja Java harus lebih berpikir ke depan dan memiliki API untuk mendapatkan ekstensi tempat mereka menulis kode bergantung platform dan Anda, sebagai pengguna API, katakan saja dapatkan ekstensi.
ArtOfWarfare
@ArtOfWarfare: OMG. Mari kita membuat JRE 100MB dengan ribuan kelas tapi pastikan untuk tidak menerapkan metode apa pun yang kembali "txt"dari "filename.txt"karena beberapa platform di suatu tempat mungkin ingin digunakan "filename,txt".
Eric Duminil
@EricDuminil "Pastikan untuk tidak menerapkan metode apa pun yang mengembalikan" txt "dari" filename.txt "" ??? Coba path.substring(path.lastIndexOf("."));..... Dan ya .. Mereka pasti tidak menduplikasi sesuatu untuk apa-apa ...
VelocityPulse
@VelocityPulse Persis itulah yang mengganggu saya. Karena tidak ada cara standar untuk mendapatkan ekstensi file, Anda mendapatkan lusinan jawaban setengah salah dan implementasi yang sedikit berbeda. Kode Anda menggunakan 2 metode (saya ingin memiliki satu metode tunggal, eksplisit), ia kembali ".txt"dari "filename.txt", yang mungkin bukan hasil yang diinginkan, dan yang terburuk, gagal dengan StringIndexOutOfBoundsExceptionmengembalikan string kosong jika tidak ada ekstensi.
Eric Duminil

Jawaban:

649

Dalam hal ini, gunakan FilenameUtils.getExtension dari Apache Commons IO

Berikut adalah contoh cara menggunakannya (Anda dapat menentukan path lengkap atau hanya nama file):

String ext1 = FilenameUtils.getExtension("/path/to/file/foo.txt"); // returns "txt"
String ext2 = FilenameUtils.getExtension("bar.exe"); // returns "exe"

Ketergantungan maven:

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.6</version>
</dependency>

DSL Gradle Groovy

implementation 'commons-io:commons-io:2.6'

Gradle Kotlin DSL

implementation("commons-io:commons-io:2.6")

Lainnya https://search.maven.org/artifact/commons-io/commons-io/2.6/jar

Juan Rojas
sumber
70
Perlu dicatat bahwa ini hanya mengembalikan "gz" untuk file bernama archive.tar.gz.
Zitrax
106
@Zitrax itu karena "gz" adalah ekstensi file.
BrainSlugs83
6
@ BrainSlugs83 Jadi apa artinya "tar"?
TuGordoBello
31
@zhelon .gz adalah singkatan dari file zip gnu, dan .tar adalah singkatan dari (t) ape (ar) lokio. Jadi .tar.gz adalah file tar di dalam file zip gnu, yang memiliki ekstensi .gz.
cirovladimir
5
Tidak ada alasan untuk membawa perpustakaan lain untuk tugas sederhana ini.
masterwok
311

Apakah Anda benar-benar membutuhkan "pengurai" untuk ini?

String extension = "";

int i = fileName.lastIndexOf('.');
if (i > 0) {
    extension = fileName.substring(i+1);
}

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 melakukan

String extension = "";

int i = fileName.lastIndexOf('.');
int p = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));

if (i > p) {
    extension = fileName.substring(i+1);
}
EboMike
sumber
4
Terima kasih! Tentu Anda mungkin memerlukan parser / objek untuk ini, jika Anda ingin melakukan lebih banyak manipulasi daripada hanya ekstensi ... katakan jika Anda hanya menginginkan path, direktori induk, nama file (minus ekstensi), dll. m berasal dari C # dan .Net di mana kita memiliki ini: msdn.microsoft.com/en-us/library/…
longda
10
Seperti yang Anda katakan, ada sejumlah hal untuk dipikirkan, di luar hanya menggunakan lastIndexOf (".") Yang naif. Saya kira Apache Commons memiliki metode untuk ini, yang memperhitungkan semua masalah potensial yang rumit.
MatrixFrog
12
Saya pikir i > 0harus diubah menjadi i >= 0atau i != -1. Ini menangani nama file seperti .htaccess.
Pijusn
8
terlepas dari betapa sederhananya cuplikan kode apa pun ... Anda masih perlu memperbarui / memeliharanya / mengujinya / membuatnya tersedia sebagai dependensi yang nyaman ... jauh lebih mudah jika sudah ada lib yang melakukan semua itu
Don Cheadle
2
Pada lebih banyak Gotcha adalah jika file diakhiri dengan titik. Lebih baik dalam lib. if (i> p && i <(fileName.length () - 1)) {extension = fileName.substring (i +1);
tgkprog
97
private String getFileExtension(File file) {
    String name = file.getName();
    int lastIndexOf = name.lastIndexOf(".");
    if (lastIndexOf == -1) {
        return ""; // empty extension
    }
    return name.substring(lastIndexOf);
}
Lukas1985
sumber
13
Perlu dicatat bahwa ini mengembalikan '.' juga, jadi ekstensi file Anda akan menjadi '.txt' sebagai lawan dari 'txt' di beberapa jawaban lain
NickEntin
2
Jawaban yang Lebih Baik dan @NickEntin Komentar yang lebih baik. Untuk menghapus periode "." dari ekstensi file, dapat dikodekan sebagai int lastIndexOf = name.lastIndexOf (".") +1;
Hanzallah Afgan
11
pendekatan itu mungkin tidak berfungsi dalam beberapa kasus, misalnya /usr/bin/foo.bar/httpconf
Iman Akbari
8
@ lukasz1985 1. ratusan paket linux membuat direktori dengan nama-nama seperti "init.d", lebih jauh itu tidak aman untuk bergantung pada path yang tidak memiliki direktori dengan titik-titik, karena itu tidak ilegal 2. Saya membuat kode untuk Android jadi saya menggunakan beberapa SDK metode yang saya tidak ingat, tetapi saya kira stackoverflow.com/a/3571239/2546146 tidak memiliki kekurangan ini
Iman Akbari
6
@Iman Akbari: getName () hanya mengembalikan nama file itu sendiri, yang akan menjadi "httpconf" dalam contoh Anda.
Dreamspace President
85

Jika Anda menggunakan perpustakaan Guava , Anda dapat menggunakan Fileskelas utilitas. Ini memiliki metode khusus getFileExtension(),. Contohnya:

String path = "c:/path/to/file/foo.txt";
String ext = Files.getFileExtension(path);
System.out.println(ext); //prints txt

Selain itu Anda juga dapat memperoleh nama file dengan fungsi yang serupa, getNameWithoutExtension () :

String filename = Files.getNameWithoutExtension(path);
System.out.println(filename); //prints foo
JeanValjean
sumber
4
Betulkah? Ini adalah perpustakaan yang hebat, penuh dengan utilitas. Sebagian besar dari mereka akan menjadi bagian dari Java8, seperti Fungsi Jambu Biji besar .
JeanValjean
Sayangnya, tidak semua orang dapat memutuskan perpustakaan mana yang akan digunakan. Setidaknya kita memiliki Apache Commons, meskipun yang lama.
Lluis Martinez
1
jika Anda melihat kode sumber getFileExtensionsebenarnya itu int dotIndex = fileName.lastIndexOf('.'); return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1)bukan masalah besar. juga, perhatikan yang Filesditandai sebagai "tidak stabil" karena beberapa alasan.
Al-Mothafar
@ Al-Mothafar banyak kelas ditandai sebagai tidak stabil (lihat pembangun multimap), saya juga tidak mengerti mengapa: beberapa rilis telah dibuat, tetapi tidak ada yang berubah di sana.
JeanValjean
27

Jika di Android, Anda dapat menggunakan ini:

String ext = android.webkit.MimeTypeMap.getFileExtensionFromUrl(file.getName());
intrepidis
sumber
Perhatikan bahwa ini tidak akan berfungsi jika string tidak dikodekan (misalnya berisi spasi atau karakter Cina), lihat: stackoverflow.com/a/14321470/1074998
Buah
14

Untuk mempertimbangkan nama file akun tanpa karakter sebelum titik, Anda harus menggunakan sedikit variasi dari jawaban yang diterima:

String extension = "";

int i = fileName.lastIndexOf('.');
if (i >= 0) {
    extension = fileName.substring(i+1);
}

"file.doc" => "doc"
"file.doc.gz" => "gz"
".doc" => "doc"
Sylvain Leroux
sumber
mungkin harus membela diri terhadap "foo." memasukkan.
chrisinmtown
14

Ini adalah metode yang diuji

public static String getExtension(String fileName) {
    char ch;
    int len;
    if(fileName==null || 
            (len = fileName.length())==0 || 
            (ch = fileName.charAt(len-1))=='/' || ch=='\\' || //in the case of a directory
             ch=='.' ) //in the case of . or ..
        return "";
    int dotInd = fileName.lastIndexOf('.'),
        sepInd = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));
    if( dotInd<=sepInd )
        return "";
    else
        return fileName.substring(dotInd+1).toLowerCase();
}

Dan uji kasus:

@Test
public void testGetExtension() {
    assertEquals("", getExtension("C"));
    assertEquals("ext", getExtension("C.ext"));
    assertEquals("ext", getExtension("A/B/C.ext"));
    assertEquals("", getExtension("A/B/C.ext/"));
    assertEquals("", getExtension("A/B/C.ext/.."));
    assertEquals("bin", getExtension("A/B/C.bin"));
    assertEquals("hidden", getExtension(".hidden"));
    assertEquals("dsstore", getExtension("/user/home/.dsstore"));
    assertEquals("", getExtension(".strange."));
    assertEquals("3", getExtension("1.2.3"));
    assertEquals("exe", getExtension("C:\\Program Files (x86)\\java\\bin\\javaw.exe"));
}
yavuzkavus
sumber
10

Saya kotor dan mungkin paling kecil menggunakan String.replaceAll :

.replaceAll("^.*\\.(.*)$", "$1")

Perhatikan bahwa pertama *adalah rakus sehingga akan mengambil karakter paling mungkin sejauh mungkin dan kemudian hanya titik terakhir dan ekstensi file akan ditinggalkan.

Ebrahim Byagowi
sumber
Ini gagal jika file tidak memiliki ekstensi.
Zack
Ya, sayangnya, masih dapat digunakan untuk skenario sederhana seperti deteksi tipe file cepat dan seperti memiliki ekstensi yang salah tidak jauh berbeda dengan tidak memilikinya, atau seseorang dapat menempatkan kondisi jika hasil dari penggantian sama dengan input.
Ebrahim Byagowi
1
Atau bahkan lebih pendek.replaceAll(".*\\.", "")
Ebrahim Byagowi
10
String path = "/Users/test/test.txt";
String extension = "";

if (path.contains("."))
     extension = path.substring(path.lastIndexOf("."));

kembali ".txt"

jika Anda hanya ingin "txt", buat path.lastIndexOf(".") + 1

VelocityPulse
sumber
9

Seperti yang jelas dari semua jawaban lain, tidak ada fungsi "bawaan" yang memadai. Ini adalah metode yang aman dan sederhana.

String getFileExtension(File file) {
    if (file == null) {
        return "";
    }
    String name = file.getName();
    int i = name.lastIndexOf('.');
    String ext = i > 0 ? name.substring(i + 1) : "";
    return ext;
}
intrepidis
sumber
7

Bagaimana dengan (menggunakan Java 1.5 RegEx):

    String[] split = fullFileName.split("\\.");
    String ext = split[split.length - 1];
Ninju Bohra
sumber
6

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:

if(FilenameUtils.isExtension(file.getName(),"java")) {
    someoperation();
}
Geng Jiawen
sumber
Perhatikan bahwa pemeriksaan ini peka terhadap huruf besar-kecil sesuai dengan dokumen.
Babken Vardanyan
6

Berikut ini adalah satu-liner untuk Java 8.

String ext = Arrays.stream(fileName.split("\\.")).reduce((a,b) -> b).orElse(null)

Ia bekerja sebagai berikut:

  1. Pisahkan string menjadi array string menggunakan "."
  2. Konversikan array menjadi stream
  3. Gunakan perkecil untuk mendapatkan elemen terakhir dari aliran, yaitu ekstensi file
Jens.Huehn_at_SlideFab.com
sumber
4

Bagaimana dengan JFileChooser? Ini tidak mudah karena Anda perlu mengurai hasil akhirnya ...

JFileChooser filechooser = new JFileChooser();
File file = new File("your.txt");
System.out.println("the extension type:"+filechooser.getTypeDescription(file));

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

/*
 * Get the extension of a file.
 */  
public static String getExtension(File f) {
    String ext = null;
    String s = f.getName();
    int i = s.lastIndexOf('.');

    if (i > 0 &&  i < s.length() - 1) {
        ext = s.substring(i+1).toLowerCase();
    }
    return ext;
}

Pertanyaan terkait: Bagaimana cara saya memotong ekstensi file dari sebuah String di Java?

eee
sumber
4

Berikut adalah metode yang menangani .tar.gzdengan benar, bahkan di jalur dengan titik-titik dalam nama direktori:

private static final String getExtension(final String filename) {
  if (filename == null) return null;
  final String afterLastSlash = filename.substring(filename.lastIndexOf('/') + 1);
  final int afterLastBackslash = afterLastSlash.lastIndexOf('\\') + 1;
  final int dotIndex = afterLastSlash.indexOf('.', afterLastBackslash);
  return (dotIndex == -1) ? "" : afterLastSlash.substring(dotIndex + 1);
}

afterLastSlash dibuat untuk membuat temuan afterLastBackslash lebih cepat karena tidak perlu mencari seluruh string jika ada beberapa garis miring di dalamnya.

Bagian char[]dalam aslinya Stringdigunakan kembali, menambahkan tidak ada sampah di sana, dan JVM mungkin akan melihat bahwa afterLastSlashsegera sampah untuk meletakkannya di tumpukan, bukan tumpukan .

Olathe
sumber
metode ini disalin dari kode sumber Guava Anda harus menyebutkan ini.
Dihembuskan
1
Saya tidak menyalin ini. Jika ada dalam kode sumber Guava, mereka menyalinnya dari sini. Mungkin beri tahu mereka.
Olathe
maaf untuk itu itu bukan btw identik, jadi semoga kamu dan pengembang jambu hanya punya ide yang sama.
Dirumahkan
2
Sungguh "gz" adalah ekstensi yang benar untuk kembali. Jika kode panggilan juga dapat menangani "tar" maka itu juga harus memeriksa, di luar getExtensionfungsi. Jika nama file pengguna "my zip. don't touch.tar.gz"maka metode ini akan mengembalikan ekstensi yang salah.
intrepidis
2
// Modified from EboMike's answer

String extension = "/path/to/file/foo.txt".substring("/path/to/file/foo.txt".lastIndexOf('.'));

ekstensi harus memiliki ".txt" di dalamnya ketika dijalankan.

longda
sumber
13
Akan macet jika nama tidak memiliki ekstensi.
EboMike
2

Inilah versi dengan Opsional sebagai nilai pengembalian (karena Anda tidak dapat memastikan file memiliki ekstensi) ... juga cek kewarasan ...

import java.io.File;
import java.util.Optional;

public class GetFileExtensionTool {

    public static Optional<String> getFileExtension(File file) {
        if (file == null) {
            throw new NullPointerException("file argument was null");
        }
        if (!file.isFile()) {
            throw new IllegalArgumentException("getFileExtension(File file)"
                    + " called on File object that wasn't an actual file"
                    + " (perhaps a directory or device?). file had path: "
                    + file.getAbsolutePath());
        }
        String fileName = file.getName();
        int i = fileName.lastIndexOf('.');
        if (i > 0) {
            return Optional.of(fileName.substring(i + 1));
        } else {
            return Optional.empty();
        }
    }
}
schuttek
sumber
2

Bagaimana dengan versi REGEX :

static final Pattern PATTERN = Pattern.compile("(.*)\\.(.*)");

Matcher m = PATTERN.matcher(path);
if (m.find()) {
    System.out.println("File path/name: " + m.group(1));
    System.out.println("Extention: " + m.group(2));
}

atau dengan ekstensi nol yang didukung:

static final Pattern PATTERN =
    Pattern.compile("((.*\\" + File.separator + ")?(.*)(\\.(.*)))|(.*\\" + File.separator + ")?(.*)");

class Separated {
    String path, name, ext;
}

Separated parsePath(String path) {
    Separated res = new Separated();
    Matcher m = PATTERN.matcher(path);
    if (m.find()) {
        if (m.group(1) != null) {
            res.path = m.group(2);
            res.name = m.group(3);
            res.ext = m.group(5);
        } else {
            res.path = m.group(6);
            res.name = m.group(7);
        }
    }
    return res;
}


Separated sp = parsePath("/root/docs/readme.txt");
System.out.println("path: " + sp.path);
System.out.println("name: " + sp.name);
System.out.println("Extention: " + sp.ext);

hasil untuk * nix:
path: / root / docs /
name: readme
Extention: txt

untuk windows, parsePath ("c: \ windows \ readme.txt"):
path: c: \ windows \
name: readme
Extention: txt

Dmitry Sokolyuk
sumber
1
String extension = com.google.common.io.Files.getFileExtension("fileName.jpg");
Alfaville
sumber
1

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.

    public static String getFileType(String path){
       String fileType = null;
       fileType = path.substring(path.indexOf('.',path.lastIndexOf('/'))+1).toUpperCase();
       return fileType;
}
Persaingan
sumber
OP sedang mencari metode
bawaan
(1) Anda harus menggunakan lastIndexOfsehingga nama file seperti john.smith.report.docdiperlakukan dengan benar. (2) Anda harus menangani kasus dengan benar ketika tidak ada ekstensi. Metode ini kembali ABC/XYZuntuk jalur seperti abc/xyz, yang tidak masuk akal. Akan lebih masuk akal untuk kembali ""atau null. (3) Pemisah file tidak selalu /.
Radiodef
1

Mendapatkan Ekstensi File dari Nama File

/**
 * The extension separator character.
 */
private static final char EXTENSION_SEPARATOR = '.';

/**
 * The Unix separator character.
 */
private static final char UNIX_SEPARATOR = '/';

/**
 * The Windows separator character.
 */
private static final char WINDOWS_SEPARATOR = '\\';

/**
 * The system separator character.
 */
private static final char SYSTEM_SEPARATOR = File.separatorChar;

/**
 * Gets the extension of a filename.
 * <p>
 * This method returns the textual part of the filename after the last dot.
 * There must be no directory separator after the dot.
 * <pre>
 * foo.txt      --> "txt"
 * a/b/c.jpg    --> "jpg"
 * a/b.txt/c    --> ""
 * a/b/c        --> ""
 * </pre>
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename the filename to retrieve the extension of.
 * @return the extension of the file or an empty string if none exists.
 */
public static String getExtension(String filename) {
    if (filename == null) {
        return null;
    }
    int index = indexOfExtension(filename);
    if (index == -1) {
        return "";
    } else {
        return filename.substring(index + 1);
    }
}

/**
 * Returns the index of the last extension separator character, which is a dot.
 * <p>
 * This method also checks that there is no directory separator after the last dot.
 * To do this it uses {@link #indexOfLastSeparator(String)} which will
 * handle a file in either Unix or Windows format.
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename  the filename to find the last path separator in, null returns -1
 * @return the index of the last separator character, or -1 if there
 * is no such character
 */
public static int indexOfExtension(String filename) {
    if (filename == null) {
        return -1;
    }
    int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);
    int lastSeparator = indexOfLastSeparator(filename);
    return (lastSeparator > extensionPos ? -1 : extensionPos);
}

/**
 * Returns the index of the last directory separator character.
 * <p>
 * This method will handle a file in either Unix or Windows format.
 * The position of the last forward or backslash is returned.
 * <p>
 * The output will be the same irrespective of the machine that the code is running on.
 *
 * @param filename  the filename to find the last path separator in, null returns -1
 * @return the index of the last separator character, or -1 if there
 * is no such character
 */
public static int indexOfLastSeparator(String filename) {
    if (filename == null) {
        return -1;
    }
    int lastUnixPos = filename.lastIndexOf(UNIX_SEPARATOR);
    int lastWindowsPos = filename.lastIndexOf(WINDOWS_SEPARATOR);
    return Math.max(lastUnixPos, lastWindowsPos);
}

Kredit

  1. Disalin dari Apache FileNameUtils Class - http://grepcode.com/file/repo1.maven.org/maven2/commons-io/commons-io/1.3.2/org/apache/commons/io/FilenameUtils.java#FilenameUtils. getExtension% 28java.lang.String% 29
Vasanth
sumber
1

Tanpa menggunakan pustaka apa pun, Anda dapat menggunakan metode String split sebagai berikut:

        String[] splits = fileNames.get(i).split("\\.");

        String extension = "";

        if(splits.length >= 2)
        {
            extension = splits[splits.length-1];
        }
Farah
sumber
0

Hanya alternatif berbasis ekspresi reguler. Tidak secepat itu, tidak sebagus itu.

Pattern pattern = Pattern.compile("\\.([^.]*)$");
Matcher matcher = pattern.matcher(fileName);

if (matcher.find()) {
    String ext = matcher.group(1);
}
shapiy
sumber
0

Saya menemukan cara yang lebih baik untuk menemukan ekstensi dengan mencampurkan semua jawaban di atas

public static String getFileExtension(String fileLink) {

        String extension;
        Uri uri = Uri.parse(fileLink);
        String scheme = uri.getScheme();
        if (scheme != null && scheme.equals(ContentResolver.SCHEME_CONTENT)) {
            MimeTypeMap mime = MimeTypeMap.getSingleton();
            extension = mime.getExtensionFromMimeType(CoreApp.getInstance().getContentResolver().getType(uri));
        } else {
            extension = MimeTypeMap.getFileExtensionFromUrl(fileLink);
        }

        return extension;
    }

public static String getMimeType(String fileLink) {
        String type = CoreApp.getInstance().getContentResolver().getType(Uri.parse(fileLink));
        if (!TextUtils.isEmpty(type)) return type;
        MimeTypeMap mime = MimeTypeMap.getSingleton();
        return mime.getMimeTypeFromExtension(FileChooserUtil.getFileExtension(fileLink));
    }
Raghav Satyadev
sumber
0

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:

private String getFileExtension(File file) {

    String name = file.getName().substring(Math.max(file.getName().lastIndexOf('/'),
            file.getName().lastIndexOf('\\')) < 0 ? 0 : Math.max(file.getName().lastIndexOf('/'),
            file.getName().lastIndexOf('\\')));
    int lastIndexOf = name.lastIndexOf(".");
    if (lastIndexOf == -1) {
        return ""; // empty extension
    }
    return name.substring(lastIndexOf + 1); // doesn't return "." with extension
}

Sesuatu seperti ini mungkin berguna dalam, katakanlah, salah satu writemetode ImageIO , di mana format file harus diteruskan.

Mengapa menggunakan seluruh API pihak ketiga saat Anda bisa menggunakan DIY?

DDPWNAGE
sumber
0

Pertanyaan khusus ini memberi saya banyak masalah kemudian saya menemukan solusi yang sangat sederhana untuk masalah ini yang saya posting di sini.

file.getName().toLowerCase().endsWith(".txt");

Itu dia.

Vikram Bhardwaj
sumber
3
OP Membutuhkan cara untuk mengekstrak ekstensi - bukan untuk menguji ekstensi.
Predrag Manojlovic
sebenarnya apa pun yang Anda kembangkan dalam sebagian besar kasus, Anda perlu berurusan dengan jenis file tertentu saja..jadi jika masalah Anda muncul di area ini, ini akan membantu Anda.
Vikram Bhardwaj
4
Yang tidak memenuhi persyaratannya
Predrag Manojlovic
2
Ini bukan jawaban untuk pertanyaan itu, tetapi ini memang yang saya cari.
Ediolot
-1

coba ini.

String[] extension = "adadad.adad.adnandad.jpg".split("\\.(?=[^\\.]+$)"); // ['adadad.adad.adnandad','jpg']
extension[1] // jpg
Adnane
sumber
-1
  @Test
    public void getFileExtension(String fileName){
      String extension = null;
      List<String> list = new ArrayList<>();
      do{
          extension =  FilenameUtils.getExtension(fileName);
          if(extension==null){
              break;
          }
          if(!extension.isEmpty()){
              list.add("."+extension);
          }
          fileName = FilenameUtils.getBaseName(fileName);
      }while (!extension.isEmpty());
      Collections.reverse(list);
      System.out.println(list.toString());
    }
Pancholi Ashish
sumber
-4

Java memiliki cara untuk menangani hal ini, di kelas java.nio.file.Files , yang dapat bekerja untuk kebutuhan Anda:

File f = new File("/path/to/file/foo.txt");
String ext = Files.probeContentType(f.toPath());
if(ext.equalsIgnoreCase("txt")) do whatever;

Perhatikan bahwa metode statis ini menggunakan spesifikasi yang ditemukan di sini untuk mengambil "tipe konten," yang dapat bervariasi.

Nick Giampietro
sumber
28
Ini salah. Tipe pengembalian untuk probeContentType adalah tipe konten Mime, bukan ekstensi file. Biasanya tidak akan cocok dengan ekstensi. Ini juga akan sangat lambat di browser file, karena sebenarnya membuka file untuk menentukan jenisnya.
Charles