Как мне обрезать расширение файла из строки в Java? - PullRequest
161 голосов
/ 02 июня 2009

Какой самый эффективный способ обрезать суффикс в Java, например:

title part1.txt
title part2.html
=>
title part1
title part2

Ответы [ 19 ]

258 голосов
/ 13 июня 2009

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

В этом случае я рекомендую использовать FilenameUtils.removeExtension () из Apache Commons IO

217 голосов
/ 02 июня 2009
str.substring(0, str.lastIndexOf('.'))
84 голосов
/ 13 июня 2009

Поскольку использование String.substring и String.lastIndex в однострочнике хорошо, есть некоторые проблемы с точки зрения возможности справиться с определенными путями к файлам.

Возьмем, к примеру, следующий путь:

a.b/c

Использование однострочника приведет к:

a

Это неверно.

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

Необходимость чеков

Вдохновленный ответом Скаффмана , я взглянул на FilenameUtils.removeExtension метод Apache Commons IO .

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

Path                  Filename
--------------        --------
a/b/c                 c
a/b/c.jpg             c
a/b/c.jpg.jpg         c.jpg

a.b/c                 c
a.b/c.jpg             c
a.b/c.jpg.jpg         c.jpg

c                     c
c.jpg                 c
c.jpg.jpg             c.jpg

(И это все, что я проверял - возможно, есть другие проверки, которые я должен пропустить.)

Реализация

Ниже приведена моя реализация метода removeExtension:

public static String removeExtension(String s) {

    String separator = System.getProperty("file.separator");
    String filename;

    // Remove the path upto the filename.
    int lastSeparatorIndex = s.lastIndexOf(separator);
    if (lastSeparatorIndex == -1) {
        filename = s;
    } else {
        filename = s.substring(lastSeparatorIndex + 1);
    }

    // Remove the extension.
    int extensionIndex = filename.lastIndexOf(".");
    if (extensionIndex == -1)
        return filename;

    return filename.substring(0, extensionIndex);
}

Запуск этого метода removeExtension с вышеуказанными тестами дает результаты, перечисленные выше.

Метод был протестирован с использованием следующего кода. Поскольку это было выполнено в Windows, разделитель пути - это \, который должен быть экранирован с \, если используется как часть литерала String.

System.out.println(removeExtension("a\\b\\c"));
System.out.println(removeExtension("a\\b\\c.jpg"));
System.out.println(removeExtension("a\\b\\c.jpg.jpg"));

System.out.println(removeExtension("a.b\\c"));
System.out.println(removeExtension("a.b\\c.jpg"));
System.out.println(removeExtension("a.b\\c.jpg.jpg"));

System.out.println(removeExtension("c"));
System.out.println(removeExtension("c.jpg"));
System.out.println(removeExtension("c.jpg.jpg"));

Результаты были:

c
c
c.jpg
c
c
c.jpg
c
c
c.jpg

Результаты - это желаемые результаты, описанные в тесте, который должен выполнить метод.

16 голосов
/ 02 июня 2009
String foo = "title part1.txt";
foo = foo.substring(0, foo.lastIndexOf('.'));
16 голосов
/ 27 мая 2011

Кстати, в моем случае, когда я хотел быстрое решение для удаления определенного расширения, это примерно то, что я сделал:

  if (filename.endsWith(ext))
    return filename.substring(0,filename.length() - ext.length());
  else
    return filename;
6 голосов
/ 03 июня 2009
String fileName="foo.bar";
int dotIndex=fileName.lastIndexOf('.');
if(dotIndex>=0) { // to prevent exception if there is no dot
  fileName=fileName.substring(0,dotIndex);
}

Это вопрос с подвохом? : Р

Я не могу придумать более быстрый способ, атм.

5 голосов
/ 07 августа 2012
filename.substring(filename.lastIndexOf('.'), filename.length()).toLowerCase();
5 голосов
/ 11 февраля 2010

Я нашел ответ coolbird особенно полезным.

Но я изменил последние операторы результата на:

if (extensionIndex == -1)
  return s;

return s.substring(0, lastSeparatorIndex+1) 
         + filename.substring(0, extensionIndex);

так как я хотел вернуть полное имя пути.

So "C:\Users\mroh004.COM\Documents\Test\Test.xml" becomes 
   "C:\Users\mroh004.COM\Documents\Test\Test" and not
   "Test"
4 голосов
/ 08 января 2018

Используйте метод в классе com.google.common.io.Files, если ваш проект уже зависит от базовой библиотеки Google. Вам нужен метод getNameWithoutExtension.

2 голосов
/ 15 октября 2017

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

String baseName = fileName.replaceAll("\\.[^.]*$", "");

Вы также можете создать объект Pattern, если хотите предварительно скомпилировать регулярное выражение.

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