Как мне обрезать расширение файла из строки в Java?
Какой самый эффективный способ обрезать суффикс в Java, например так:
title part1.txt
title part2.html
=>
title part1
title part2
23 ответа
Это тот код, который мы не должны делать сами. Используйте библиотеки для мирских вещей, спасите свой мозг для тяжелых вещей.
В этом случае я рекомендую использовать FilenameUtils.removeExtension() из Apache Commons IO
Как с помощью String.substring
а также String.lastIndex
в одной строке это хорошо, есть некоторые проблемы с точки зрения возможности справиться с определенными путями к файлам.
Возьмем для примера следующий путь:
a.b/c
Использование однострочника приведет к:
a
Это неверно
Результат должен был быть c
, но так как у файла не было расширения, но путь имел каталог с .
в имени однолинейный метод был обманут, чтобы дать часть пути в качестве имени файла, что не является правильным.
Нужны чеки
Вдохновленный ответом Скаффмана, я взглянул на FilenameUtils.removeExtension
метод Apache Commons IO.
Чтобы воссоздать его поведение, я написал несколько тестов, которые должен выполнить новый метод, а именно:
Путь Имя файла -------------- -------- 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
метод:
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
Результаты - это желаемые результаты, изложенные в тесте, который должен выполнить метод.
String foo = "title part1.txt";
foo = foo.substring(0, foo.lastIndexOf('.'));
Кстати, в моем случае, когда я хотел быстрое решение для удаления определенного расширения, это примерно то, что я сделал:
if (filename.endsWith(ext))
return filename.substring(0,filename.length() - ext.length());
else
return filename;
Вы можете попробовать эту функцию, очень простой
public String getWithoutExtension(String fileFullPath){
return fileFullPath.substring(0, fileFullPath.lastIndexOf('.'));
}
Используйте метод в com.google.common.io.Files
Класс, если ваш проект уже зависит от основной библиотеки Google. Метод, который вам нужен getNameWithoutExtension
,
String fileName="foo.bar";
int dotIndex=fileName.lastIndexOf('.');
if(dotIndex>=0) { // to prevent exception if there is no dot
fileName=fileName.substring(0,dotIndex);
}
Это вопрос с подвохом?:п
Я не могу думать о более быстром способе.
Я нашел ответ CoolBird особенно полезным.
Но я изменил последний результат заявления на:
if (extensionIndex == -1)
return s;
return s.substring(0, lastSeparatorIndex+1)
+ filename.substring(0, extensionIndex);
как я хотел, чтобы было возвращено полное имя пути.
Так что "C:\Users\mroh004.COM\Documents\Test\Test.xml" становится "C:\Users\mroh004.COM\Documents\Test\Test", а не "Тестовое задание"
filename.substring(filename.lastIndexOf('.'), filename.length()).toLowerCase();
Если вы используете Spring, вы можете использовать
org.springframework.util.StringUtils.stripFilenameExtension(String path)
Удалите расширение имени файла из указанного пути ресурса Java, например
«mypath / myfile.txt» -> «mypath / myfile».
Params: path - путь к файлу
Возвращает: путь с удаленным расширением имени файла
Используйте регулярное выражение. Этот заменит последнюю точку и все, что после нее.
String baseName = fileName.replaceAll("\\.[^.]*$", "");
Вы также можете создать объект Pattern, если хотите предварительно скомпилировать регулярное выражение.
private String trimFileExtension(String fileName)
{
String[] splits = fileName.split( "\\." );
return StringUtils.remove( fileName, "." + splits[splits.length - 1] );
}
не делайте стресс на виду, ребята. делал уже много раз. просто скопируйте и вставьте этот общедоступный статический метод в свою библиотеку staticUtils для будущего использования ;-)
static String removeExtension(String path){
String filename;
String foldrpath;
String filenameWithoutExtension;
if(path.equals("")){return "";}
if(path.contains("\\")){ // direct substring method give wrong result for "a.b.c.d\e.f.g\supersu"
filename = path.substring(path.lastIndexOf("\\"));
foldrpath = path.substring(0, path.lastIndexOf('\\'));;
if(filename.contains(".")){
filenameWithoutExtension = filename.substring(0, filename.lastIndexOf('.'));
}else{
filenameWithoutExtension = filename;
}
return foldrpath + filenameWithoutExtension;
}else{
return path.substring(0, path.lastIndexOf('.'));
}
}
Создайте новый файл с путем строкового изображения
String imagePath;
File test = new File(imagePath);
test.getName();
test.getPath();
getExtension(test.getName());
public static String getExtension(String uri) {
if (uri == null) {
return null;
}
int dot = uri.lastIndexOf(".");
if (dot >= 0) {
return uri.substring(dot);
} else {
// No extension.
return "";
}
}
String[] splitted = fileName.split(".");
String fileNameWithoutExtension = fileName.replace("." + splitted[splitted.length - 1], "");
org.apache.commons.io.FilenameUtils версии 2.4 дает следующий ответ
public static String removeExtension(String filename) {
if (filename == null) {
return null;
}
int index = indexOfExtension(filename);
if (index == -1) {
return filename;
} else {
return filename.substring(0, index);
}
}
public static int indexOfExtension(String filename) {
if (filename == null) {
return -1;
}
int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);
int lastSeparator = indexOfLastSeparator(filename);
return lastSeparator > extensionPos ? -1 : extensionPos;
}
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);
}
public static final char EXTENSION_SEPARATOR = '.';
private static final char UNIX_SEPARATOR = '/';
private static final char WINDOWS_SEPARATOR = '\\';
Лучшее, что я могу написать, пытаясь придерживаться класса Path:
Path removeExtension(Path path) {
return path.resolveSibling(path.getFileName().toString().replaceFirst("\\.[^.]*$", ""));
}
Я бы сделал так:
String title_part = "title part1.txt";
int i;
for(i=title_part.length()-1 ; i>=0 && title_part.charAt(i)!='.' ; i--);
title_part = title_part.substring(0,i);
Начиная с конца до "." затем вызовите подстроку.
Изменить: не может быть гольф, но это эффективно:)
Принимая во внимание сценарии, в которых отсутствует расширение файла или имеется более одного расширения файла
пример Имя файла: файл | file.txt | file.tar.bz2
/**
*
* @param fileName
* @return file extension
* example file.fastq.gz => fastq.gz
*/
private String extractFileExtension(String fileName) {
String type = "undefined";
if (FilenameUtils.indexOfExtension(fileName) != -1) {
String fileBaseName = FilenameUtils.getBaseName(fileName);
int indexOfExtension = -1;
while (fileBaseName.contains(".")) {
indexOfExtension = FilenameUtils.indexOfExtension(fileBaseName);
fileBaseName = FilenameUtils.getBaseName(fileBaseName);
}
type = fileName.substring(indexOfExtension + 1, fileName.length());
}
return type;
}
private String trimFileName(String fileName)
{
String[] ext;
ext = fileName.split("\\.");
return fileName.replace(ext[ext.length - 1], "");
}
String img = "example.jpg";
// String imgLink = "http://www.example.com/example.jpg";
URI uri = null;
try {
uri = new URI(img);
String[] segments = uri.getPath().split("/");
System.out.println(segments[segments.length-1].split("\\.")[0]);
} catch (Exception e) {
e.printStackTrace();
}
Это выведет пример для img и imgLink
public static String removeExtension(String file) {
if(file != null && file.length() > 0) {
while(file.contains(".")) {
file = file.substring(0, file.lastIndexOf('.'));
}
}
return file;
}