Как я могу получить расширение файла в Java? - PullRequest
434 голосов
/ 26 августа 2010

Просто чтобы прояснить, я не ищу тип MIME.

Допустим, у меня есть следующий ввод: /path/to/file/foo.txt

Я бы хотел, чтобы это сломалосьвведите, в частности, .txt для расширения.Есть ли способ сделать это в Java?Я бы не хотел писать свой собственный парсер.

Ответы [ 29 ]

589 голосов
/ 25 апреля 2013

В этом случае используйте FilenameUtils.getExtension из Apache Commons IO

Вот пример того, как его использовать (вы можете указать либо полный путь, либо просто имя файла):

String ext1 = FilenameUtils.getExtension("/path/to/file/foo.txt"); // returns "txt"
String ext2 = FilenameUtils.getExtension("bar.exe"); // returns "exe"
282 голосов
/ 26 августа 2010

Вам действительно нужен для этого "парсер"?

String extension = "";

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

Предполагая, что вы имеете дело с простыми именами файлов в стиле Windows, а не с archive.tar.gz.

Кстати, для случая, когда каталог может иметь «.», Но само имя файла не имеет (как /path/to.a/file), вы можете сделать

String extension = "";

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

if (i > p) {
    extension = fileName.substring(i+1);
}
90 голосов
/ 24 февраля 2014
private String getFileExtension(File file) {
    String name = file.getName();
    int lastIndexOf = name.lastIndexOf(".");
    if (lastIndexOf == -1) {
        return ""; // empty extension
    }
    return name.substring(lastIndexOf);
}
80 голосов
/ 13 апреля 2013

Если вы используете библиотеку Guava , вы можете использовать Files служебный класс.У него есть определенный метод, getFileExtension().Например:

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

Кроме того, вы также можете получить имя файла с аналогичной функцией, getNameWithoutExtension () :

String filename = Files.getNameWithoutExtension(path);
System.out.println(filename); //prints foo
28 голосов
/ 26 марта 2015

Если на Android вы можете использовать это:

String ext = android.webkit.MimeTypeMap.getFileExtensionFromUrl(file.getName());
15 голосов
/ 11 сентября 2013

Чтобы учесть имена файлов без символов перед точкой, необходимо использовать небольшое отклонение принятого ответа:

String extension = "";

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

"file.doc" => "doc"
"file.doc.gz" => "gz"
".doc" => "doc"
10 голосов
/ 14 марта 2014

Мое грязное и, возможно, самое маленькое, используя String.replaceAll :

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

Обратите внимание, что сначала * является жадным, поэтому он будет захватывать максимально возможное количество символов, а затем останется только последняя точка и расширение файла.

10 голосов
/ 29 марта 2016

Это проверенный метод

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();
}

И контрольный пример:

@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"));
}
9 голосов
/ 15 февраля 2018

Как видно из всех других ответов, адекватной «встроенной» функции не существует. Это безопасный и простой метод.

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;
}
6 голосов
/ 10 июня 2014

Если вы планируете использовать Apache commons-io и просто хотите проверить расширение файла, а затем выполнить какую-либо операцию, вы можете использовать this , вот фрагмент:

if(FilenameUtils.isExtension(file.getName(),"java")) {
    someoperation();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...