Как получить имя файла без расширения в Java? - PullRequest
226 голосов
/ 29 мая 2009

Может кто-нибудь сказать мне, как получить имя файла без расширения? Пример:

fileNameWithExt = "test.xml";
fileNameWithOutExt = "test";

Ответы [ 12 ]

376 голосов
/ 27 ноября 2009

Если вы, как и я, предпочитаете использовать некоторый библиотечный код, где они, вероятно, подумали обо всех особых случаях, например, что происходит, если вы передаете null или точки в пути, но не в имени файла , вы можете использовать следующее:

import org.apache.commons.io.FilenameUtils;
String fileNameWithOutExt = FilenameUtils.removeExtension(fileNameWithExt);
140 голосов
/ 29 мая 2009

Самый простой способ - использовать регулярное выражение.

fileNameWithOutExt = "test.xml".replaceFirst("[.][^.]+$", "");

Приведенное выше выражение удалит последнюю точку, за которой следует один или несколько символов. Вот базовый юнит-тест.

public void testRegex() {
    assertEquals("test", "test.xml".replaceFirst("[.][^.]+$", ""));
    assertEquals("test.2", "test.2.xml".replaceFirst("[.][^.]+$", ""));
}
51 голосов
/ 29 мая 2009

См. Следующую тестовую программу:

public class javatemp {
    static String stripExtension (String str) {
        // Handle null case specially.

        if (str == null) return null;

        // Get position of last '.'.

        int pos = str.lastIndexOf(".");

        // If there wasn't any '.' just return the string as is.

        if (pos == -1) return str;

        // Otherwise return the string, up to the dot.

        return str.substring(0, pos);
    }

    public static void main(String[] args) {
        System.out.println ("test.xml   -> " + stripExtension ("test.xml"));
        System.out.println ("test.2.xml -> " + stripExtension ("test.2.xml"));
        System.out.println ("test       -> " + stripExtension ("test"));
        System.out.println ("test.      -> " + stripExtension ("test."));
    }
}

который выводит:

test.xml   -> test
test.2.xml -> test.2
test       -> test
test.      -> test
40 голосов
/ 10 апреля 2013

Если ваш проект использует Гуава (14.0 или новее), вы можете перейти с Files.getNameWithoutExtension().

(По сути то же самое, что и FilenameUtils.removeExtension() из Apache Commons IO, как подсказывает ответ с наибольшим количеством голосов . Просто хотел отметить, что Гуава тоже делает это. Лично я не хотел добавлять зависимость Commons - который я чувствую немного пережиток - только из-за этого.)

33 голосов
/ 16 марта 2015

Вот порядок консолидированного списка по моим предпочтениям.

Использование Apache Commons

import org.apache.commons.io.FilenameUtils;

String fileNameWithoutExt = FilenameUtils.getBaseName(fileName);

                           OR

String fileNameWithOutExt = FilenameUtils.removeExtension(fileName);

Использование Google Guava (если вы уже используете его)

import com.google.common.io.Files;
String fileNameWithOutExt = Files.getNameWithoutExtension(fileName);

Или с использованием Core Java

1)

String fileName = file.getName();
int pos = fileName.lastIndexOf(".");
if (pos > 0 && pos < (fileName.length() - 1)) { // If '.' is not the first or last character.
    fileName = fileName.substring(0, pos);
}

2)

if (fileName.indexOf(".") > 0) {
   return fileName.substring(0, fileName.lastIndexOf("."));
} else {
   return fileName;
}

3)

private static final Pattern ext = Pattern.compile("(?<=.)\\.[^.]+$");

public static String getFileNameWithoutExtension(File file) {
    return ext.matcher(file.getName()).replaceAll("");
}

Liferay API

import com.liferay.portal.kernel.util.FileUtil; 
String fileName = FileUtil.stripExtension(file.getName());
5 голосов
/ 14 декабря 2016

Если вы не хотите импортировать полный apache.commons, я извлек ту же функциональность:

public class StringUtils {
    public static String getBaseName(String filename) {
        return removeExtension(getName(filename));
    }

    public static int indexOfLastSeparator(String filename) {
        if(filename == null) {
            return -1;
        } else {
            int lastUnixPos = filename.lastIndexOf(47);
            int lastWindowsPos = filename.lastIndexOf(92);
            return Math.max(lastUnixPos, lastWindowsPos);
        }
    }

    public static String getName(String filename) {
        if(filename == null) {
            return null;
        } else {
            int index = indexOfLastSeparator(filename);
            return filename.substring(index + 1);
        }
    }

    public static String removeExtension(String filename) {
        if(filename == null) {
            return null;
        } else {
            int index = indexOfExtension(filename);
            return index == -1?filename:filename.substring(0, index);
        }
    }

    public static int indexOfExtension(String filename) {
        if(filename == null) {
            return -1;
        } else {
            int extensionPos = filename.lastIndexOf(46);
            int lastSeparator = indexOfLastSeparator(filename);
            return lastSeparator > extensionPos?-1:extensionPos;
        }
    }
}
4 голосов
/ 04 июля 2016

Ниже указана ссылка от https://android.googlesource.com/platform/tools/tradefederation/+/master/src/com/android/tradefed/util/FileUtil.java

/**
 * Gets the base name, without extension, of given file name.
 * <p/>
 * e.g. getBaseName("file.txt") will return "file"
 *
 * @param fileName
 * @return the base name
 */
public static String getBaseName(String fileName) {
    int index = fileName.lastIndexOf('.');
    if (index == -1) {
        return fileName;
    } else {
        return fileName.substring(0, index);
    }
}
4 голосов
/ 07 декабря 2012

Хотя я большой сторонник повторного использования библиотек, JAR org.apache.commons.io.io имеет размер 174 КБ, что заметно для мобильного приложения.

Если вы скачаете исходный код и посмотрите на их класс FilenameUtils, вы увидите, что есть много дополнительных утилит, и они справляются с путями Windows и Unix, что прекрасно.

Однако, если вам просто нужна пара статических служебных методов для использования с путями в стиле Unix (с разделителем "/"), вам может пригодиться приведенный ниже код.

Метод removeExtension сохраняет остаток пути вместе с именем файла. Существует также аналогичный getExtension.

/**
 * Remove the file extension from a filename, that may include a path.
 * 
 * e.g. /path/to/myfile.jpg -> /path/to/myfile 
 */
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);
    }
}

/**
 * Return the file extension from a filename, including the "."
 * 
 * e.g. /path/to/myfile.jpg -> .jpg
 */
public static String getExtension(String filename) {
    if (filename == null) {
        return null;
    }

    int index = indexOfExtension(filename);

    if (index == -1) {
        return filename;
    } else {
        return filename.substring(index);
    }
}

private static final char EXTENSION_SEPARATOR = '.';
private static final char DIRECTORY_SEPARATOR = '/';

public static int indexOfExtension(String filename) {

    if (filename == null) {
        return -1;
    }

    // Check that no directory separator appears after the 
    // EXTENSION_SEPARATOR
    int extensionPos = filename.lastIndexOf(EXTENSION_SEPARATOR);

    int lastDirSeparator = filename.lastIndexOf(DIRECTORY_SEPARATOR);

    if (lastDirSeparator > extensionPos) {
        LogIt.w(FileSystemUtil.class, "A directory separator appears after the file extension, assuming there is no file extension");
        return -1;
    }

    return extensionPos;
}
0 голосов
/ 06 апреля 2019

Использование FilenameUtils.removeExtension из Apache Commons IO

Пример:

Вы можете указать полное имя пути или только имя файла .

String myString1 = FilenameUtils.removeExtension("helloworld.exe"); // returns "helloworld"
String myString2 = FilenameUtils.removeExtension("/home/abc/yey.xls"); // returns "yey"

Надеюсь, это поможет ..

0 голосов
/ 25 сентября 2018
public static String getFileExtension(String fileName) {
        if (TextUtils.isEmpty(fileName) || !fileName.contains(".") || fileName.endsWith(".")) return null;
        return fileName.substring(fileName.lastIndexOf(".") + 1);
    }

    public static String getBaseFileName(String fileName) {
        if (TextUtils.isEmpty(fileName) || !fileName.contains(".") || fileName.endsWith(".")) return null;
        return fileName.substring(0,fileName.lastIndexOf("."));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...