Поскольку класс Java File
не поддерживает поиск расширения, я предлагаю вам создать подкласс File
, который предоставляет эту возможность:
package mypackage;
/**
* Enhances java.io.File functionality by adding extension awareness.
*/
public class File extends java.io.File {
/**
* Returns the characters after the last period.
*
* @return An empty string if there is no extension.
*/
public String getExtension() {
String name = getName();
String result = "";
int index = name.lastIndexOf( '.' );
if( index > 0 ) {
result = name.substring( index );
}
return result;
}
}
Теперь просто замените свою версию файла на версию Java и, в сочетании с ответом Курта, даст вам все, что вам нужно.
Обратите внимание, что использование подкласса идеально, потому что, если вы хотите изменить поведение (из-за другой операционной системы, использующей другой маркер-разделитель расширений), вам нужно обновить только один метод, и все ваше приложение продолжает работать. (Или если вам нужно исправить ошибку, например, попытаться выполнить str.substring( -1 )
.)
Другими словами, если вы извлекаете расширение файла в более чем в одном месте в вашей кодовой базе, вы допустили ошибку.
Если пойти дальше, если вы хотите полностью абстрагироваться от знания типа файла (поскольку некоторые операционные системы могут не использовать разделитель .
), вы можете написать:
/**
* Enhances java.io.File functionality by adding extension awareness.
*/
public class File extends java.io.File {
public File( String filename ) {
super( filename );
}
/**
* Returns true if the file type matches the given type.
*/
public boolean isType( String type ) {
return getExtension().equals( type );
}
/**
* Returns the characters after the last period.
*
* @return An empty string if there is no extension.
*/
private String getExtension() {
String name = getName();
String result = "";
int index = name.lastIndexOf( '.' );
if( index > 0 ) {
result = name.substring( index );
}
return result;
}
}
Я бы посчитал это более надежным решением. Это позволило бы легко заменить более продвинутый механизм обнаружения типов файлов (анализ содержимого файлов для определения типа) без необходимости изменения вызывающего кода. Пример:
File file = new File( "myfile.txt" );
if( file.isType( "png" ) ) {
System.out.println( "PNG image found!" );
}
Если пользователь сохранит «myfile.png» как «myfile.txt», изображение все равно будет обработано, поскольку расширенная версия (здесь не показана) будет искать маркер «PNG», который запускает каждый файл PNG в (кибер) мир.