Для 95% проектов это должен быть принятый ответ. Переписывание такого кода является основной причиной многих головных болей!
Карстен Хоффманн
1
Просто добавьте следующую строку в gradle для добавления зависимости: - скомпилируйте 'commons-io: commons-io: 2.6'
Deepak Sharma
пример пожалуйста.
Джон Ктехик
8
Если у вас уже есть Apache Commons I / O в вашем проекте, это правильно. Но если это все, что вам нужно от этого, вы добавляете (как минимум) 2,5 МБ собственного веса в свой проект для чего-то, что можно легко сделать с помощью одной строки.
if (str! = null && str.contains (".")) str.substring (0, str.lastIndexOf ('.')). FilenameUtils - еще одна зависимость, и она не всегда доступна
ocramot
88
Поскольку использование String.substringи String.lastIndexв одной строке хорошо, есть некоторые проблемы с точки зрения возможности справиться с определенными путями к файлам.
Возьмем для примера следующий путь:
a.b/c
Использование однострочника приведет к:
a
Это неверно
Результат должен был быть c, но поскольку у файла отсутствовало расширение, но путь имел каталог с .именем в имени, метод с одной строкой был обманут, чтобы дать часть пути в качестве имени файла, что не является правильным.
Чтобы воссоздать его поведение, я написал несколько тестов, которые должен выполнить новый метод, а именно:
Путь Имя файла
-------------- --------
A / B / куб.см
a / b / c.jpg c
a / b / c.jpg.jpg c.jpg
AB / куб.см
ab / c.jpg c
ab / c.jpg.jpg c.jpg
куб.см
c.jpg c
c.jpg.jpg c.jpg
(И это все, что я проверял - возможно, есть другие проверки, которые я должен пропустить.)
Реализация
Ниже приведена моя реализация removeExtensionметода:
Запуск этого removeExtensionметода с вышеуказанными тестами дает результаты, перечисленные выше.
Метод был протестирован с использованием следующего кода. Поскольку это было выполнено в Windows, разделитель пути - это символ, \который должен быть экранирован \при использовании в качестве части Stringлитерала.
Нет, может быть более одного '.'; Вы хотите lastIndexOf ('.')
Адам Яскевич
-1 за то, что не использовал метод, который, как я думал, вы использовали. Это теперь +0 от меня. Измени это быстро! ;)
Майкл Майерс
7
String fileName="foo.bar";int dotIndex=fileName.lastIndexOf('.');if(dotIndex>=0){// to prevent exception if there is no dot
fileName=fileName.substring(0,dotIndex);}
Используйте метод в com.google.common.io.Filesклассе, если ваш проект уже зависит от основной библиотеки Google. Метод, который вам нужен getNameWithoutExtension.
Это преобразует «a.jpg.jpg» в «a» вместо (правильного) «a.jpg». Какой цели служит file.length() > 0проверка?
Клаус Гюттер
Главный вопрос был «как удалить расширение?», Так что да, его преобразование «a.txt.zip» в «a» и «.htaccess» в пустоту. Эта функция работает со строками, поэтому имена файлов могут быть не нулевыми, но при этом иметь длину 0, быстрее проверяйте, стоит ли оно того, перед анализом символов. С уважением.
Ответы:
Это тот код, который мы не должны делать сами. Используйте библиотеки для мирских вещей, спасите свой мозг для тяжелых вещей.
В этом случае я рекомендую использовать FilenameUtils.removeExtension () из Apache Commons IO
источник
источник
if(str.contains("."))
str.substring(0, str.lastIndexOf('.'))
Поскольку использование
String.substring
иString.lastIndex
в одной строке хорошо, есть некоторые проблемы с точки зрения возможности справиться с определенными путями к файлам.Возьмем для примера следующий путь:
Использование однострочника приведет к:
Это неверно
Результат должен был быть
c
, но поскольку у файла отсутствовало расширение, но путь имел каталог с.
именем в имени, метод с одной строкой был обманут, чтобы дать часть пути в качестве имени файла, что не является правильным.Нужны чеки
Вдохновленный ответом Скаффмана , я взглянул на
FilenameUtils.removeExtension
метод Apache Commons IO .Чтобы воссоздать его поведение, я написал несколько тестов, которые должен выполнить новый метод, а именно:
(И это все, что я проверял - возможно, есть другие проверки, которые я должен пропустить.)
Реализация
Ниже приведена моя реализация
removeExtension
метода:Запуск этого
removeExtension
метода с вышеуказанными тестами дает результаты, перечисленные выше.Метод был протестирован с использованием следующего кода. Поскольку это было выполнено в Windows, разделитель пути - это символ,
\
который должен быть экранирован\
при использовании в качестве частиString
литерала.Результаты были:
Результаты - это желаемые результаты, изложенные в тесте, который должен выполнить метод.
источник
System.getProperty("file.separator")
а не толькоFile.separator
?/path/to/.htaccess
Кстати, в моем случае, когда я хотел быстрое решение для удаления определенного расширения, это примерно то, что я сделал:
источник
источник
Это вопрос с подвохом? :п
Я не могу думать о более быстром способе.
источник
Используйте метод в
com.google.common.io.Files
классе, если ваш проект уже зависит от основной библиотеки Google. Метод, который вам нуженgetNameWithoutExtension
.источник
Вы можете попробовать эту функцию, очень простой
источник
Я нашел ответ CoolBird особенно полезным.
Но я изменил последний результат заявления на:
как я хотел, чтобы было возвращено полное имя пути.
источник
источник
Используйте регулярное выражение. Эта заменяет последнюю точку и все после нее.
Вы также можете создать объект Pattern, если хотите предварительно скомпилировать регулярное выражение.
источник
источник
"\\."
"." специально для регулярных выражений.создайте новый файл с путем строкового изображения
источник
org.apache.commons.io.FilenameUtils версии 2.4 дает следующий ответ
источник
источник
Я бы сделал так:
Начиная с конца и до "." затем вызовите подстроку.
Изменить: не может быть гольф, но это эффективно :)
источник
Принимая во внимание сценарии, в которых отсутствует расширение файла или имеется более одного расширения файла
пример Имя файла: файл | file.txt | file.tar.bz2
источник
Это выведет пример для img и imgLink
источник
источник
file.length() > 0
проверка?