Удалить расширение файла списка файлов в Java [duplicate]

Интересно, что ни один из ответов на этой странице не упоминает два крайних случая, надеюсь, никто не возражает, если я их добавлю:

Случай с краем # 1: одновременный доступ к Словарю

Родовые словари в .NET не являются потокобезопасными, а иногда могут бросать NullReference или даже (чаще) a KeyNotFoundException при попытке получить доступ к ключу из двух параллельных потоков. Исключение в этом случае является довольно ошибочным.

Случай с краем # 2: небезопасный код

Если код NullReferenceException задан кодом unsafe, вы можете посмотреть на переменные указателя , и проверьте их на IntPtr.Zero или что-то в этом роде. Это одно и то же («исключение нулевого указателя»), но в небезопасном коде переменные часто переводятся в типы значений / массивы и т. Д., И вы ударяете головой о стену, задаваясь вопросом, как тип значения может исключение.

(Еще одна причина для небезопасного использования небезопасного кода, если вам это нужно)

146
задан Michael Myers 2 June 2009 в 20:02
поделиться

17 ответов

filename.substring(filename.lastIndexOf('.'), filename.length()).toLowerCase();
5
ответ дан Alexander 3 September 2018 в 16:04
поделиться
  • 1
    Напротив того, что было задано, и нет необходимости передавать длину, просто используйте одну подстроку arg – user 19 October 2013 в 15:48

Учитывать сценарии, в которых нет расширения файла или существует более одного расширения файла

example Имя файла: файл | 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;
}
0
ответ дан Choesang 3 September 2018 в 16:04
поделиться

Я нашел ответ 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"
83
ответ дан Community 3 September 2018 в 16:04
поделиться
  • 1
    Отличный ответ. Есть ли особая причина, по которой вы используете System.getProperty("file.separator"), а не только File.separator? – halirutan 4 September 2013 в 23:10
  • 2
    +1 Это намного более полно. – Attacktive 26 December 2014 в 05:37
  • 3
    Предупреждение: это решение также удаляет предыдущий путь, а не только расширение, в отличие от метода ввода-вывода Apache Commons. – DHa 21 April 2016 в 22:34
  • 4
    Похоже, что это не удастся для /path/to/.htaccess – Kuzeko 4 May 2016 в 15:22

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

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

242
ответ дан Felix Bohnacker 3 September 2018 в 16:04
поделиться
  • 1
    Абсолютно ударился. – Joshua Pinter 5 December 2013 в 07:10
  • 2
    Для 95% проектов это должен быть принятый ответ. Такой код переписывания является основной причиной многих головных болей! – Carsten Hoffmann 1 August 2016 в 14:19
  • 3
    Просто добавьте следующую строку в gradle, чтобы добавить зависимость: - compile 'commons-io: commons-io: 2.6' – Deepak Sharma 21 December 2017 в 15:50
  • 4
    пример пожалуйста. – john ktejik 10 April 2018 в 00:08
  • 5
    Если у вас уже есть в / в Apache Commons, это верно. Но если это все, что вам нужно от этого, вы добавляете (по крайней мере) 2,5 МБ мертвого веса в свой проект для чего-то, что можно легко сделать с помощью одной строки. – foo 3 September 2018 в 09:40

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

  if (filename.endsWith(ext))
    return filename.substring(0,filename.length() - ext.length());
  else
    return filename;
16
ответ дан Hartmut Pfitzinger 3 September 2018 в 16:04
поделиться
String fileName="foo.bar";
int dotIndex=fileName.lastIndexOf('.');
if(dotIndex>=0) { // to prevent exception if there is no dot
  fileName=fileName.substring(0,dotIndex);
}

Это трюк? : p

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

6
ответ дан Huxi 3 September 2018 в 16:04
поделиться
String foo = "title part1.txt";
foo = foo.substring(0, foo.lastIndexOf('.'));
15
ответ дан Jherico 3 September 2018 в 16:04
поделиться
  • 1
    Нет, может быть больше одного. вы хотите lastIndexOf ('.') – Adam Jaskiewicz 2 June 2009 в 20:12
  • 2
    -1 для того, чтобы не использовать метод, который, как я думал, вы использовали. Это теперь всего +0 от меня. Измените это быстро! ;) – Michael Myers♦ 2 June 2009 в 20:18
String[] splitted = fileName.split(".");
String fileNameWithoutExtension = fileName.replace("." + splitted[splitted.length - 1], "");
1
ответ дан Mahdak 3 September 2018 в 16:04
поделиться
  • 1
    Необходимо разделить на "\\." как "." специально для регулярного выражения. – Compass 23 December 2014 в 20:24

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

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 "";
        }
    }
1
ответ дан Pravin Bhosale 3 September 2018 в 16:04
поделиться

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

public String getWithoutExtension(String fileFullPath){
    return fileFullPath.substring(0, fileFullPath.lastIndexOf('.'));
}
1
ответ дан Shantonu 3 September 2018 в 16:04
поделиться

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

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

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

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

0
ответ дан Shashi 3 September 2018 в 16:04
поделиться
  • 1
    Это в основном то, что делает lastIndexOf; зачем изобретать колесо? – Michael Myers♦ 2 June 2009 в 20:01
  • 2
    Для удовольствия и быть немного описательным. только то. (и я забыл про lastIndexOf, когда писал это) – fmsf 2 June 2009 в 20:04

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 = '\\';
1
ответ дан Someone Somewhere 3 September 2018 в 16:04
поделиться

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

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

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

2
ответ дан Steven Spungin 3 September 2018 в 16:04
поделиться
str.substring(0, str.lastIndexOf('.'))
202
ответ дан Sunny Milenov 3 September 2018 в 16:04
поделиться
  • 1
    Это нужно назначить новой переменной, так как str не изменяется. – Nathan Feger 2 June 2009 в 20:24
  • 2
    Обращайтесь с осторожностью: он выдаст вам исключение, если имя файла не имеет суффикса. – Andreas_D 2 June 2009 в 23:44
  • 3
    как насчет archive.tar.bz2? – Antonio 1 May 2011 в 09:46
  • 4
    if(str.contains(".")) str.substring(0, str.lastIndexOf('.')) – Nicolas Tyler 20 June 2013 в 13:04
  • 5
    if (str! = null & amp; str.contains (& quot;.)) str.substring (0, str.lastIndexOf ('.')). FilenameUtils - другая зависимость, и не всегда доступна – ocramot 24 July 2014 в 15:16
 private String trimFileExtension(String fileName)
  {
     String[] splits = fileName.split( "\\." );
     return StringUtils.remove( fileName, "." + splits[splits.length - 1] );
  }
1
ответ дан supernova 3 September 2018 в 16:04
поделиться

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

3
ответ дан Toby 3 September 2018 в 16:04
поделиться
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

0
ответ дан urs86ro 3 September 2018 в 16:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: