Как получить расширение файла в Java
1. обзор
В этом кратком руководстве мы покажем, как программно получить расширение файла на Java. We’ll focus on three major approaches to the problem.с
В наших реализациях будут возвращены символы после финального ‘.'.
Поэтому, в качестве быстрого примера, если имя нашего файлаjarvis.txt, тогда он вернетString «txt” в качестве расширения файла.
2. Получение расширения файла
Для каждого подхода мы узнаем, как его реализовать, и проследим, что происходит в двух особых случаях:
-
когда имя файла не имеет расширений, например файлmakefile
-
и если имя файла состоит только из расширения, например.gitignore или.DS_Store.
2.1. Простой подход к обработкеString
При таком подходе мы будем использовать простой подход обработкиString для поиска расширения:
public Optional getExtensionByStringHandling(String filename) {
return Optional.ofNullable(filename)
.filter(f -> f.contains("."))
.map(f -> f.substring(filename.lastIndexOf(".") + 1));
}
Этот метод проверяет наличие точки ‘. ' вхождение в заданном имени файла.
Если он существует, он найдет последнюю позицию точки ‘. ' и вернуть символы после этого, символы после последней точки ‘. ' известный как расширение файла.
Особые случаи:
-
No extension - этот метод вернет пустойString
-
Only extension - этот метод вернетString после точки, например “gitignore”
2.2. FilenameUtils.getExtension из Apache Commons IO
Во втором подходе мы найдем расширение, используя служебный класс, предоставляемый библиотекой ввода-вывода Apache Commons:
public String getExtensionByApacheCommonLib(String filename) {
return FilenameUtils.getExtension(filename);
}
Здесь вместо имени файла мы также можем указать полный путь к файлуe.g. «C:/example/com/demo.java».
МетодgetExtension(String) проверит, является ли данныйfilename пустым или нет.
Еслиfilename пустое или нулевое значение,getExtension(String filename) вернет данный экземпляр. В противном случае он возвращает расширение имени файла.
Для этого он использует методindexOfExtension(String), который, в свою очередь, используетlastIndexof(char) для поиска последнего вхождения ".". Оба эти метода предоставляютсяFilenameUtils.
Этот метод также проверяет отсутствие разделителя каталогов после последней точки с помощью другого методаindexOfLastSeparator(String),, который будет обрабатывать файл в формате Unix или Windows.
Особые случаи:
-
No extension - этот метод вернет пустую строку.
-
Only extension - этот метод вернетString после точки, например “gitignore”
2.3. Использование библиотеки Guava
В этом последнем подходе мы будем использовать библиотеку Guava для поиска расширения.
Чтобы добавить библиотеку Guava, мы можем добавить следующую зависимость к нашемуpom.xml:
com.google.guava
guava
24.1.1-jre
Для последней зависимости мы можем проверитьMaven Central.
После добавления библиотеки мы можем просто использовать ее методgetFileExtension:
public String getExtensionByGuava(String filename) {
return Files.getFileExtension(filename);
}
МетодgetFileExtension(String) сначала проверит, пуст ли данныйfilename.
Еслиfilename не пуст, то он создаст экземплярFile путем преобразования заданногоfilename в абстрактный путь и вызовет методFile’sgetName() поверх it, который вернет имя файла, обозначенного этим абстрактным путем, или пустую строку, если заданныйfilename пуст.
На основе этого возвращаемого значения выбирается индекс последнего появления символа «.» с помощью встроенного методаString классаlastIndexOf(char).
Особые случаи:
-
Без расширения - этот метод вернет пустойString
-
Только расширение - этот метод вернетString после точки, например “gitignore”
3. Заключение
При выборе между ApacheCommons иGuava, в то время как обе библиотеки имеют некоторые общие функции, а также функциональность, отсутствующую в их альтернативе.
Это означает, что если требуется определенная функциональность, выберите ту, которая имеет ее. В противном случае, если требуется больше пользовательских сценариев, выберите тот, который выполняет большинство ваших задач, и не стесняйтесь обернуть его собственной реализацией, чтобы получить желаемый результат.
Также ознакомьтесь со всеми примерами в этой статьеon Github.