Как обрезать расширение файла из String в Java?

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

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

Ответ 1

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

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

Ответ 2

str.substring(0, str.lastIndexOf('.'))

Ответ 3

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

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

a.b/c

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

a

Это неверно.

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

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

Вдохновленный ответом скаффмана, я взглянул на 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

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

Ответ 4

String foo = "title part1.txt";
foo = foo.substring(0, foo.lastIndexOf('.'));

Ответ 5

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

  if (filename.endsWith(ext))
    return filename.substring(0,filename.length() - ext.length());
  else
    return filename;

Ответ 6

String fileName="foo.bar";
int dotIndex=fileName.lastIndexOf('.');
if(dotIndex>=0) { // to prevent exception if there is no dot
  fileName=fileName.substring(0,dotIndex);
}

Это трюк?: Р

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

Ответ 7

Я нашел отзыв о 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"

Ответ 8

filename.substring(filename.lastIndexOf('.'), filename.length()).toLowerCase();

Ответ 9

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

Ответ 10

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

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

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

Ответ 11

String[] splitted = fileName.split(".");
String fileNameWithoutExtension = fileName.replace("." + splitted[splitted.length - 1], "");

Ответ 12

создать новый файл со строковым образцом

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 "";
        }
    }

Ответ 13

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 = '\\';

Ответ 14

 private String trimFileExtension(String fileName)
  {
     String[] splits = fileName.split( "\\." );
     return StringUtils.remove( fileName, "." + splits[splits.length - 1] );
  }

Ответ 15

Вы можете попробовать эту функцию, очень простой

public String getWithoutExtension(String fileFullPath){
    return fileFullPath.substring(0, fileFullPath.lastIndexOf('.'));
}

Ответ 16

Я бы сделал следующее:

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);

Начиная с конца до '.' затем вызовите подстроку.

Изменить: Не может быть гольф, но он эффективен:)

Ответ 17

Помня о сценариях, где нет расширения файла или существует более одного расширения файла

example Имя файла: file | 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;
}

Ответ 18

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

Ответ 19

public static String removeExtension(String file) {
    if(file != null && file.length() > 0) {
        while(file.contains(".")) {
            file = file.substring(0, file.lastIndexOf('.'));
        }
    }
    return file;
}