Автор оригинала: mkyong.
В этой статье показано, как получить расширение файла файла на Java.
Темы
- Получить расширение файла нормально
- Получить расширение файла строго
- Получить жесткий код расширения файла
- Общие имена файлов ввода–вывода Apache
Path: /path/foo.txt -> File Extension: txt Path: . -> File Extension: Path: .. -> File Extension: Path: /path/run.exe -> File Extension: exe Path: /path/makefile -> File Extension: Path: /path/.htaccess -> File Extension: htaccess Path: /path/.tar.gz -> File Extension: gz Path: /path/../makefile -> File Extension: Path: /path/dir.test/makefile -> File Extension:
Просмотрите приведенный выше вывод из примера строгого расширения файла Get. Для файла, у которого нет расширения, мы отобразим пустой.
1. Получите расширение файла, обычную версию.
В этом примере показано, как использовать Строку#lastIndexOf для получения расширения файла, и в большинстве случаев оно должно соответствовать.
String extension = ""; int index = fileName.lastIndexOf('.'); if (index > 0) { extension = fileName.substring(index + 1); }
Однако описанный выше метод не сработает в следующих случаях: имя каталога или путь к файлу содержат точку или двойные точки, А файл не имеет расширения.
Path: /path/../makefile -> File Extension: /makefile Path: /path/dir.test/makefile -> File Extension: test/makefile
Полный пример.
package com.mkyong.io.howto; public class GetFileExtension1 { private static final String OUTPUT_FORMAT = "Path: %-30s -> File Extension: %s"; public static void main(String[] args) { String[] files = { "/path/foo.txt", ".", "..", "/path/run.exe", "/path/makefile", "/path/.htaccess", "/path/.tar.gz", "/path/../makefile", "/path/dir.test/makefile" }; for (String file : files) { String output = String.format(OUTPUT_FORMAT, file, getFileExtension(file)); System.out.println(output); } } /** * Fail for below cases ** "/path/../makefile", * "/path/dir.test/makefile" */ public static String getFileExtension(String fileName) { if (fileName == null) { throw new IllegalArgumentException("fileName must not be null!"); } String extension = ""; int index = fileName.lastIndexOf('.'); if (index > 0) { extension = fileName.substring(index + 1); } return extension; } }
Выход
Path: /path/foo.txt -> File Extension: txt Path: . -> File Extension: Path: .. -> File Extension: Path: /path/run.exe -> File Extension: exe Path: /path/makefile -> File Extension: Path: /path/.htaccess -> File Extension: htaccess Path: /path/.tar.gz -> File Extension: gz Path: /path/../makefile -> File Extension: /makefile Path: /path/dir.test/makefile -> File Extension: test/makefile
2. Получите расширение файла, строгую версию.
В этом примере реализована дополнительная проверка того, что каталог содержит точку, а файл не имеет расширения.
Path: /path/../makefile -> File Extension: Path: /path/dir.test/makefile -> File Extension:
Дополнительная проверка гарантирует, что последний индекс расширения файла (позиция) всегда находится после последнего разделителя файлов (Windows или Unix).
if (indexOfLastExtension > indexOflastSeparator) { extension = fileName.substring(indexOfLastExtension + 1); }
Полный пример.
package com.mkyong.io.howto; import java.util.Map; public class GetFileExtension2 { private static final String OUTPUT_FORMAT = "Path: %-30s -> File Extension: %s"; private static final String WINDOWS_FILE_SEPARATOR = "\\"; private static final String UNIX_FILE_SEPARATOR = "/"; private static final String FILE_EXTENSION = "."; public static void main(String[] args) { String[] files = { "/path/foo.txt", ".", "..", "/path/run.exe", "/path/makefile", "/path/.htaccess", "/path/.tar.gz", "/path/../makefile", "/path/dir.test/makefile" }; for (String file : files) { String output = String.format(OUTPUT_FORMAT, file, getFileExtensionImproved(file)); System.out.println(output); } } /** * Add extra checking for below cases ** "/path/../makefile", * "/path/dir.test/makefile" */ public static String getFileExtensionImproved(String fileName) { if (fileName == null) { throw new IllegalArgumentException("fileName must not be null!"); } String extension = ""; int indexOfLastExtension = fileName.lastIndexOf(FILE_EXTENSION); // check last file separator, windows and unix int lastSeparatorPosWindows = fileName.lastIndexOf(WINDOWS_FILE_SEPARATOR); int lastSeparatorPosUnix = fileName.lastIndexOf(UNIX_FILE_SEPARATOR); // takes the greater of the two values, which mean last file separator int indexOflastSeparator = Math.max(lastSeparatorPosWindows, lastSeparatorPosUnix); // make sure the file extension appear after the last file separator if (indexOfLastExtension > indexOflastSeparator) { extension = fileName.substring(indexOfLastExtension + 1); } return extension; } }
Выход
Path: /path/foo.txt -> File Extension: txt Path: . -> File Extension: Path: .. -> File Extension: Path: /path/run.exe -> File Extension: exe Path: /path/makefile -> File Extension: Path: /path/.htaccess -> File Extension: htaccess Path: /path/.tar.gz -> File Extension: gz Path: /path/../makefile -> File Extension: Path: /path/dir.test/makefile -> File Extension:
3. Получить расширение файла, версия жесткого кода
В этом примере показано, как жестко закодировать некоторые расширения файлов и отобразить предопределенный результат. Например, для расширения файла .tar.gz
, мы хотим отобразить tar.gz
, не гз
.
package com.mkyong.io.howto; import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; public class GetFileExtension3 { private static final String OUTPUT_FORMAT = "Path: %-30s -> File Extension: %s"; private static final String WINDOWS_FILE_SEPARATOR = "\\"; private static final String UNIX_FILE_SEPARATOR = "/"; private static final String FILE_EXTENSION = "."; private static final MapKNOWN_EXTENSION = createKnownExtensionMap(); public static void main(String[] args) { String[] files = { "/path/foo.txt", ".", "..", "/path/run.exe", "/path/makefile", "/path/.htaccess", "/path/.tar.gz", "/path/../makefile", "/path/dir.test/makefile" }; for (String file : files) { String output = String.format(OUTPUT_FORMAT, file, getFileExtensionKnownExtension(file)); System.out.println(output); } } public static String getFileExtensionImproved(String fileName) { if (fileName == null) { throw new IllegalArgumentException("fileName must not be null!"); } String extension = ""; int indexOfLastExtension = fileName.lastIndexOf(FILE_EXTENSION); int indexOflastSeparator = Math.max( fileName.lastIndexOf(WINDOWS_FILE_SEPARATOR), fileName.lastIndexOf(UNIX_FILE_SEPARATOR) ); if (indexOfLastExtension > indexOflastSeparator) { extension = fileName.substring(indexOfLastExtension + 1); } return extension; } // hardcoded public static String getFileExtensionKnownExtension(final String fileName) { if (fileName == null) { throw new IllegalArgumentException("fileName must not be null!"); } // if the file name is end with the hard coded extension. // Java 8 stream, loop map if key matches get value String extension = KNOWN_EXTENSION .entrySet() .stream() .filter(x -> fileName.endsWith(x.getKey())) .map(x -> x.getValue()) .collect(Collectors.joining()); if ("".equals(extension)) { extension = getFileExtensionImproved(fileName); // see example 2 } return extension; } private static Map createKnownExtensionMap() { Map result = new HashMap<>(); result.put(".tar.gz", "tar.gz"); // if .tar.gz, gets tar.gz result.put("makefile", "make"); // if makefile, get make //...extra return result; } }
Выход
Path: /path/foo.txt -> File Extension: txt Path: . -> File Extension: Path: .. -> File Extension: Path: /path/run.exe -> File Extension: exe Path: /path/makefile -> File Extension: make Path: /path/.htaccess -> File Extension: htaccess Path: /path/.tar.gz -> File Extension: tar.gz Path: /path/../makefile -> File Extension: make Path: /path/dir.test/makefile -> File Extension: make
4. Общий ввод-вывод Apache
Для Apache commons-io
мы можем использовать Имя файла.getExtension(имя файла)
чтобы получить расширение файла файла.
commons-io commons-io 2.7
Полный пример.
package com.mkyong.io.howto; import org.apache.commons.io.FilenameUtils; public class GetFileExtension4 { private static final String OUTPUT_FORMAT = "Path: %-30s -> File Extension: %s"; public static void main(String[] args) { String[] files = { "/path/foo.txt", ".", "..", "/path/run.exe", "/path/makefile", "/path/.htaccess", "/path/.tar.gz", "/path/../makefile", "/path/dir.test/makefile" }; for (String file : files) { String output = String.format(OUTPUT_FORMAT, file, FilenameUtils.getExtension(fileName)); System.out.println(output); } } }
Выход
Path: /path/foo.txt -> File Extension: txt Path: . -> File Extension: Path: .. -> File Extension: Path: /path/run.exe -> File Extension: exe Path: /path/makefile -> File Extension: Path: /path/.htaccess -> File Extension: htaccess Path: /path/.tar.gz -> File Extension: gz Path: /path/../makefile -> File Extension: Path: /path/dir.test/makefile -> File Extension:
Скачать Исходный Код
$клон git $клон git
$cd java-ввод-вывод
Рекомендации
- Общий доступ Apache IO
- Имена файлов javadoc
- Строка#Последний индекс javadoc
- Как получить путь к файлу в Java
- Википедия – Расширение имени файла
Оригинал: “https://mkyong.com/java/how-to-get-file-extension-in-java/”