5

Как получить расширение файла в Java?

12

Чтобы было понятно, я не ищу MIME-тип.

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

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

5 ответ(ов)

3

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

String extension = "";

int i = fileName.lastIndexOf('.');
if (i > 0) {
    extension = fileName.substring(i + 1);
}

Этот фрагмент корректно работает для простых имен файлов на Windows, однако, как вы упомянули, он не учитывает случаи, когда в имени директории есть точки (например, /path/to.a/file). Чтобы избежать этой проблемы, можно использовать ваш усовершенствованный код:

String extension = "";

int i = fileName.lastIndexOf('.');
int p = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));

if (i > p) {
    extension = fileName.substring(i + 1);
}

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

Однако, если ваши файлы могут иметь более сложные расширения, например, archive.tar.gz, и вам нужно обрабатывать такие случаи, тогда может потребоваться более сложный парсер. В общем, для большинства простых сценариев указанный вами подход вполне рабочий.

1

Ваш метод getFileExtension в Java возвращает расширение файла в виде строки. Ниже приведен его перевод на русский и объяснение работы:

private String getFileExtension(File file) {
    String name = file.getName(); // Получаем имя файла
    int lastIndexOf = name.lastIndexOf("."); // Находим позицию последней точки в имени файла
    if (lastIndexOf == -1) {
        return ""; // Если точка не найдена, возвращаем пустую строку (расширение отсутствует)
    }
    return name.substring(lastIndexOf); // Возвращаем подстроку, начиная с последней точки включительно
}

Объяснение:

  1. Метод принимает объект File в качестве аргумента.
  2. Из имени файла извлекается строка name.
  3. Метод lastIndexOf ищет последнюю точку в имени файла. Если точки нет, метод вернет -1.
  4. Если точка не найдена, метод возвращает пустую строку, что подразумевает отсутствие расширения у файла.
  5. В противном случае, метод возвращает подстроку, начиная с последней точки, что соответствует расширению файла (включая точку).

Такой подход позволяет эффективно получить расширение, однако стоит помнить, что в некоторых случаях файл может не иметь расширения, а также может быть много точек в имени файла. Убедитесь, что данный метод соответствует вашим требованиям.

0

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

String ext = android.webkit.MimeTypeMap.getFileExtensionFromUrl(file.getName());

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

0

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

Вот реализация метода:

public static String getExtension(String fileName) {
    char ch;
    int len;
    if (fileName == null || 
            (len = fileName.length()) == 0 || 
            (ch = fileName.charAt(len - 1)) == '/' || ch == '\\' || // в случае, если это директория
            ch == '.') // в случае, если это . или ..
        return "";
        
    int dotInd = fileName.lastIndexOf('.'),
        sepInd = Math.max(fileName.lastIndexOf('/'), fileName.lastIndexOf('\\'));
    if (dotInd <= sepInd)
        return "";
    else
        return fileName.substring(dotInd + 1).toLowerCase();
}

Метод делает следующее:

  1. Проверяет, является ли fileName нулевым или пустым. Если да, то возвращает пустую строку.
  2. Проверяет, не является ли последний символ /, \ или .. Если это так, он также возвращает пустую строку, так как это не допустимое имя файла.
  3. Находит индекс последней точки и последнего разделителя файловой системы. Если точка находится до или на том же уровне, что и разделитель, метод также возвращает пустую строку.
  4. В противном случае, он возвращает подстроку после последней точки в нижнем регистре, что и является расширением файла.

Вы также можете протестировать этот метод с использованием написанного теста:

@Test
public void testGetExtension() {
    assertEquals("", getExtension("C"));
    assertEquals("ext", getExtension("C.ext"));
    assertEquals("ext", getExtension("A/B/C.ext"));
    assertEquals("", getExtension("A/B/C.ext/"));
    assertEquals("", getExtension("A/B/C.ext/.."));
    assertEquals("bin", getExtension("A/B/C.bin"));
    assertEquals("hidden", getExtension(".hidden"));
    assertEquals("dsstore", getExtension("/user/home/.dsstore"));
    assertEquals("", getExtension(".strange."));
    assertEquals("3", getExtension("1.2.3"));
    assertEquals("exe", getExtension("C:\\Program Files (x86)\\java\\bin\\javaw.exe"));
}

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

0

Чтобы учесть имена файлов без символов перед точкой, вам нужно использовать немного изменённый вариант принятого ответа:

String extension = "";

int i = fileName.lastIndexOf('.');
if (i >= 0) {
    extension = fileName.substring(i + 1);
}

Примеры работы кода:

"file.doc" => "doc"
"file.doc.gz" => "gz"
".doc" => "doc"

Этот код ищет последнюю точку в строке с именем файла и, если она существует, извлекает все символы после неё, что позволяет получить расширение файла даже в тех случаях, когда нет символов перед точкой.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь