Поскольку использование 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
Результаты - это желаемые результаты, описанные в тесте, который должен выполнить метод.