Как проверить расширение файла на Android

В моем приложении, когда мы просматриваем файл с SD-карты, файлы будут .text, .jpg и видеофайлы mpeg4ie.

Я хочу хранить каждый тип файла в определенной папке. Например, файлы .text помещаются в текстовую папку. Когда я выбираю файл, как мне проверить расширение файла?


person Nilesh Verma    schedule 04.02.2011    source источник
comment
Возможно, это может быть полезно: stackoverflow.com/q/53869269/3894304   -  person Marcel Hofgesang    schedule 21.01.2020


Ответы (13)


Я бы получил имя файла в виде строки, разделил его на массив с помощью "." в качестве разделителя, а затем получить последний индекс массива, который будет расширением файла. Например:

public class main {
    public static void main(String[] args) {
        String filename = "image.jpg";
        String filenameArray[] = filename.split("\\.");
        String extension = filenameArray[filenameArray.length-1];
        System.out.println(extension);
    }
}

Что выводит:

jpg
person Mike Lentini    schedule 04.02.2011
comment
Суть, которую я пытаюсь донести, заключается в том, чтобы не использовать регулярное выражение для такой простой задачи, как эта, а не проверку ошибок. - person Ray Zhou; 02.04.2012
comment
Что, если я просматриваю файл из галереи своего телефона Android, где он возвращает имя файла как content://media/external/images/media/3669. Могу ли я получить расширение имени файла в этом? @МайкЛентини - person Ashokchakravarthi Nagarajan; 26.06.2014

Или вы могли бы просто сделать:

MimeTypeMap.getFileExtensionFromUrl(myfile.toURL().toString());

Примечание: этот метод не очень надежен...

person Pedro    schedule 22.08.2011
comment
поскольку File#toURL() устарел, это должно быть myfile.toURI().toURL().toString() - person Somatik; 07.11.2011

Вы можете использовать FilenameUtils из < em>Общие ресурсы Apache:

String extension = FilenameUtils.getExtension(mFile.getName());
person Phil    schedule 08.05.2014

Вы также можете сделать что-то вроде приведенного ниже и использовать endWith.

public void walkdir(File dir) {
    String txtPattern = ".txt";
    String jpgPattern = ".jpg";
    String mp3Pattern = ".mp3";

    File listFile[] = dir.listFiles();

    if (listFile != null) {
        for (int i = 0; i < listFile.length; i++) {

            if (listFile[i].isDirectory()) {
                walkdir(listFile[i]);
            }
            else {
                if (listFile[i].getName().endsWith(txtPattern)){
                    // Put in txt folder

                } else if (listFile[i].getName().endsWith(jpgPattern.toLowerCase())){
                    // Put in jpg folder

                } else if (istFile[i].getName().endsWith(mp3Pattern.toLowerCase())) {
                    // Put in mp3 folder
                }
            }
        }
    }
}

Извините, я не проверял работу, но она должна сделать это за вас.

person Matt    schedule 23.05.2011
comment
Расширения, чувствительные к регистру? Как насчет файлов с именем readme.TXT и т. д. - person Diederik; 30.10.2012

Это работает для меня:

public static String getExtension(String fileName) {
    String encoded;
    try { encoded = URLEncoder.encode(fileName, "UTF-8").replace("+", "%20"); }
    catch(UnsupportedEncodingException e) { encoded = fileName; }
    return MimeTypeMap.getFileExtensionFromUrl(encoded).toLowerCase();
}

Когда файл /mnt/sdcard/boomerang/2013-06-18_12:08:53.txt, возвращается "txt".

Обратите внимание, что вызовы URLEncoder.encode и .repalce должны исправить любые проблемы с надежностью, которые могут возникнуть, когда MimeTypeMap.getFileExtensionFromUrl вызывается сама по себе. Например, без вызовов кодирования и замены имена файлов, такие как "Test Image!.jpg", возвращают пустые строки. Также убедитесь, что имя файла написано в нижнем регистре. В нем MimeTypeMap нет записей для .PNG или .JPG.

person Xavi    schedule 18.06.2013
comment
String ext = "", fileName = file.getName().toLowerCase(); try { ext = MimeTypeMap.getFileExtensionFromUrl(fileName); } catch (Exception e) { e.printStackTrace(); } работал на меня. - person Zankhna; 18.02.2014
comment
@zanky В большинстве случаев это работает, но бывают случаи (я не помню, какие именно - прошло несколько месяцев), когда он неожиданно дает сбой. По моему опыту, вызов Uri.encode для имени файла сводил вероятность сбоя к нулю. - person Xavi; 18.02.2014
comment
@Xavi ... ya, возможно, вы правы, но в моем случае, когда я использовал Uri.Encode, он возвращал расширение файла encodes, формат которого был примерно таким 3gp%4a%5D..., поэтому я удалил метод encode(). - person Zankhna; 19.02.2014
comment
@zanky Ха, это действительно странно. Я буду следить за этим. Спасибо, что дали мне знать. - person Xavi; 19.02.2014

У меня не было возможности запустить это (так что это может не сработать на 100%), но это должно быть то, что вы ищете:

File files[] = Environment.getExternalStorageDirectory().listFiles();
for (File f : files)
{
    String fullPath = f.getAbsolutePath();
    int dot = fullPath.lastIndexOf(".");
    String ext = fullPath.substring(dot + 1);
    if (ext.equalsIgnoreCase("txt")) // Make sure case is irrelevant
                                     // for your use case; otherwise
                                     // use ext.equals("txt").
    {
        // Do something with f here
    }
}
person brendan    schedule 04.02.2011

Я нашел хороший пример на docs.oracle.com. о том, как получить расширение файла, которое возвращает расширение типа файла в нижнем регистре или нуль, если расширения файла нет:

    /*
     * 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;
    }
person andrew    schedule 29.05.2013

Самый короткий способ узнать расширение файла — использовать lastIndexOf('.'), предполагая, что имя файла содержит расширение. Проверьте следующий код:

String fileName = "test.jpg";
int i = fileName.lastIndexOf('.');
String fileExtension = fileName.substring(i+1);
Log.v("FILE EXTENSION: ", fileExtension);
person Umesh    schedule 13.01.2014

Материал .endsWith("ваше расширение"):

String whatever = you String;

if (whatever.endsWith("jpg")) {
    // Your jpg code
}
else if(whatever.endsWith("png")) {
   // Your png code
}
person Umasankar    schedule 15.08.2017
comment
Что вы подразумеваете под Материал? - person Peter Mortensen; 04.11.2019

Вот метод, который проверяет все случаи

    String getExtension(String fileName){
        final String emptyExtension = "";
        if(fileName == null){
            return emptyExtension;
        }
        int index = fileName.lastIndexOf(".");
        if(index == -1){
            return emptyExtension;
        }
        return fileName.substring(index + 1);
    }
person Ilya Gazman    schedule 16.10.2014

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

File[] files = (new File("/sdcard/yourDirectory/").listFiles(new CustomFilter());

....


class CustomFilter implements FileFilter
{
    //Add the file extensions you want to look for here:
    private String[] extension =
        { "text", "jpg", "jpeg", "mpeg" };

    @Override
    public boolean accept(File pathname)
    {
        String name = pathname.getName().toLowerCase();

        for (String anExt : extension)
        {
            if (name.endsWith(anExt))
            {
                // A file has been detected with that extension
                return true;
            }
        }
        return false;
    }
}
person MJ93    schedule 06.01.2013

onclick(View view) {
    GetFileExtension(videouri);
    Toast.makeText(this, "Exten: "+GetFileExtension(videouri), Toast.LENGTH_SHORT).show();
}

// Get Extension
public String GetFileExtension(Uri uri){

    ContentResolver contentResolver = getContentResolver();
    MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();

    // Return file extension
    return mimeTypeMap.getExtensionFromMimeType(contentResolver.getType(uri));
}

Здесь переменная videouri содержит видео. Я имею в виду:

videouri = data.getData();

в onResultActivity.

Вы можете передать сюда любую переменную, такую ​​как изображение, видео, MP3 и файл/документы. Он будет работать для всех типов содержимого.

Это корпоративный код, который в основном используется в коммерческих целях.

Я на 100% уверен, что он будет работать с уверенностью...

person Pradeep Sheoran    schedule 11.06.2018

person    schedule
comment
Можете ли вы объяснить часть +1? - person RoCk RoCk; 31.08.2016
comment
@RoCK Без +1 это был бы, например, .jpg вместо jpg. Обратите внимание на точку. - person mmm111mmm; 10.10.2016
comment
Можно упростить как fileName.substring(fileName.lastIndexOf(.) + 1). - person rzaaeeff; 21.04.2017