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

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

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

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

Ответы [ 29 ]

1 голос
/ 18 ноября 2016

Получение расширения файла из имени файла

<code>/**
 * The extension separator character.
 */
private static final char EXTENSION_SEPARATOR = '.';

/**
 * The Unix separator character.
 */
private static final char UNIX_SEPARATOR = '/';

/**
 * The Windows separator character.
 */
private static final char WINDOWS_SEPARATOR = '\\';

/**
 * The system separator character.
 */
private static final char SYSTEM_SEPARATOR = File.separatorChar;

/**
 * Gets the extension of a filename.
 * <p>
 * This method returns the textual part of the filename after the last dot.
 * There must be no directory separator after the dot.
 * <pre>
 * foo.txt      --> "txt"
 * a/b/c.jpg    --> "jpg"
 * a/b.txt/c    --> ""
 * a/b/c        --> ""
 * 
*

* Вывод будет одинаковым независимо от машины, на которой выполняется код.* * @param filename имя файла для получения расширения.* @ вернуть расширение файла или пустую строку, если таковой не существует.* / public static String getExtension (String filename) {if (filename == null) {return null;} int index = indexOfExtension (filename);if (index == -1) {return "";} else {return filename.substring (index + 1);}} / ** * Возвращает индекс последнего символа разделителя расширения, который является точкой.*

* Этот метод также проверяет отсутствие разделителя каталогов после последней точки.* Для этого он использует {@link #indexOfLastSeparator (String)}, который будет * обрабатывать файл в формате Unix или Windows.*

* Вывод будет одинаковым независимо от машины, на которой работает код.* * @param filename имя файла, в котором находится последний разделитель пути, null возвращает -1 * @ возврат индекса последнего символа разделителя или -1, если * такого символа нет * / public static int indexOfExtension (String filename){if (filename == null) {return -1;} int extensionPos = filename.lastIndexOf (EXTENSION_SEPARATOR);int lastSeparator = indexOfLastSeparator (имя файла);return (lastSeparator> extensionPos? -1: extensionPos);} / ** * Возвращает индекс последнего символа разделителя каталогов.*

* Этот метод будет обрабатывать файл в формате Unix или Windows.* Позиция последнего форварда или обратной косой черты возвращается.*

* Вывод будет одинаковым независимо от компьютера, на котором запущен код.* * @param filename имя файла, в котором находится последний разделитель пути, null возвращает -1 * @ возврат индекса последнего символа разделителя или -1, если * такого символа нет * / public static int indexOfLastSeparator (String filename){if (filename == null) {return -1;} int lastUnixPos = filename.lastIndexOf (UNIX_SEPARATOR);int lastWindowsPos = filename.lastIndexOf (WINDOWS_SEPARATOR);return Math.max (lastUnixPos, lastWindowsPos);}

Кредиты

  1. Скопировано из Apache FileNameUtils Class - http://grepcode.com/file/repo1.maven.org/maven2/commons-io/commons-io/1.3.2/org/apache/commons/io/FilenameUtils.java#FilenameUtils.getExtension%28java.lang.String%29
1 голос
/ 16 июня 2015

Здесь я сделал небольшой метод (однако не такой безопасный и не проверяющий много ошибок), но если только вы программируете обычную java-программу, этого более чем достаточно, чтобы найти тип файла.Это не работает для сложных типов файлов, но они обычно используются не так часто.

    public static String getFileType(String path){
       String fileType = null;
       fileType = path.substring(path.indexOf('.',path.lastIndexOf('/'))+1).toUpperCase();
       return fileType;
}
0 голосов
/ 16 декабря 2018

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

Без реализации какого-либо стороннего API, я предлагаю:

private String getFileExtension(File file) {

    String name = file.getName().substring(Math.max(file.getName().lastIndexOf('/'),
            file.getName().lastIndexOf('\\')) < 0 ? 0 : Math.max(file.getName().lastIndexOf('/'),
            file.getName().lastIndexOf('\\')));
    int lastIndexOf = name.lastIndexOf(".");
    if (lastIndexOf == -1) {
        return ""; // empty extension
    }
    return name.substring(lastIndexOf + 1); // doesn't return "." with extension
}

Нечто подобное может быть полезно, скажем, в любом из методов ImageIO write где формат файла должен быть передан.

Зачем использовать сторонний API, если вы можете сделать DIY?

0 голосов
/ 13 мая 2013

Просто альтернатива на основе регулярных выражений. Не так быстро, не так хорошо.

Pattern pattern = Pattern.compile("\\.([^.]*)$");
Matcher matcher = pattern.matcher(fileName);

if (matcher.find()) {
    String ext = matcher.group(1);
}
0 голосов
/ 15 января 2018

Я нашел лучший способ найти расширение, смешав все ответы выше

public static String getFileExtension(String fileLink) {

        String extension;
        Uri uri = Uri.parse(fileLink);
        String scheme = uri.getScheme();
        if (scheme != null && scheme.equals(ContentResolver.SCHEME_CONTENT)) {
            MimeTypeMap mime = MimeTypeMap.getSingleton();
            extension = mime.getExtensionFromMimeType(CoreApp.getInstance().getContentResolver().getType(uri));
        } else {
            extension = MimeTypeMap.getFileExtensionFromUrl(fileLink);
        }

        return extension;
    }

public static String getMimeType(String fileLink) {
        String type = CoreApp.getInstance().getContentResolver().getType(Uri.parse(fileLink));
        if (!TextUtils.isEmpty(type)) return type;
        MimeTypeMap mime = MimeTypeMap.getSingleton();
        return mime.getMimeTypeFromExtension(FileChooserUtil.getFileExtension(fileLink));
    }
0 голосов
/ 11 января 2018
  @Test
    public void getFileExtension(String fileName){
      String extension = null;
      List<String> list = new ArrayList<>();
      do{
          extension =  FilenameUtils.getExtension(fileName);
          if(extension==null){
              break;
          }
          if(!extension.isEmpty()){
              list.add("."+extension);
          }
          fileName = FilenameUtils.getBaseName(fileName);
      }while (!extension.isEmpty());
      Collections.reverse(list);
      System.out.println(list.toString());
    }
0 голосов
/ 08 ноября 2017

попробуйте это.

String[] extension = "adadad.adad.adnandad.jpg".split("\\.(?=[^\\.]+$)"); // ['adadad.adad.adnandad','jpg']
extension[1] // jpg
0 голосов
/ 26 сентября 2013

Java имеет встроенный способ решения этой проблемы в классе java.nio.file.Files , который может работать для ваших нужд:

File f = new File("/path/to/file/foo.txt");
String ext = Files.probeContentType(f.toPath());
if(ext.equalsIgnoreCase("txt")) do whatever;

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

0 голосов
/ 24 апреля 2016

Этот конкретный вопрос доставляет мне много проблем, тогда я нашел очень простое решение этой проблемы, которое я публикую здесь.

file.getName().toLowerCase().endsWith(".txt");

Вот и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...