如何获取没有Java扩展名的文件名?

时间:2009-05-29 04:31:40

标签: java file

有谁能告诉我如何获取没有扩展名的文件名? 例如:

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

19 个答案:

答案 0 :(得分:375)

如果你像我一样,宁愿使用一些库代码,他们可能已经考虑过所有特殊情况,比如如果你传入 null 或路径中的点而不是filename,您可以使用以下内容:

import org.apache.commons.io.FilenameUtils;
String fileNameWithOutExt = FilenameUtils.removeExtension(fileNameWithExt);

答案 1 :(得分:140)

最简单的方法是使用正则表达式。

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

上面的表达式将删除最后一个点,后跟一个或多个字符。这是一个基本的单元测试。

public void testRegex() {
    assertEquals("test", "test.xml".replaceFirst("[.][^.]+$", ""));
    assertEquals("test.2", "test.2.xml".replaceFirst("[.][^.]+$", ""));
}

答案 2 :(得分:51)

参见以下测试程序:

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

答案 3 :(得分:39)

如果您的项目使用 Guava (14.0或更高版本),则可以使用Files.getNameWithoutExtension()

(基本上与来自Apache Commons IO的FilenameUtils.removeExtension()相同,正如highest-voted answer所暗示的那样。只想指出Guava也这样做。我个人不想将依赖添加到Commons-哪个我觉得这是一个遗物 - 只是因为这个。)

答案 4 :(得分:33)

以下是我偏好的合并列表顺序。

使用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 :(得分:5)

如果您不想导入完整的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;
        }
    }
}

答案 6 :(得分:4)

虽然我非常相信重用库,但org.apache.commons.io JAR为174KB,这对于移动应用来说非常大。

如果您下载源代码并查看他们的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;
}

答案 7 :(得分:4)

以下是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);
    }
}

答案 8 :(得分:0)

fileEntry.getName().substring(0, fileEntry.getName().lastIndexOf("."));

答案 9 :(得分:0)

对于 Kotlin,它现在很简单:

val fileNameStr = file.nameWithoutExtension

答案 10 :(得分:0)

我的解决方案需要以下导入。

import java.io.File;

以下方法应返回所需的输出字符串:

private static String getFilenameWithoutExtension(File file) throws IOException {
    String filename = file.getCanonicalPath();
    String filenameWithoutExtension;
    if (filename.contains("."))
        filenameWithoutExtension = filename.substring(filename.lastIndexOf(System.getProperty("file.separator"))+1, filename.lastIndexOf('.'));
    else
        filenameWithoutExtension = filename.substring(filename.lastIndexOf(System.getProperty("file.separator"))+1);

    return filenameWithoutExtension;
}

答案 11 :(得分:0)

如果您确定文件名中只有一个点可用于扩展名,则可以使用java split函数从扩展名中拆分文件名。

File filename = new File('test.txt'); File.getName().split("[.]");

因此split[0]将返回“测试”,而split [1]将返回“ txt”

答案 12 :(得分:0)

简单起见,请使用Java的String.replaceAll()方法,如下所示:

String fileNameWithExt = "test.xml";
String fileNameWithoutExt
   = fileNameWithExt.replaceAll( "^.*?(([^/\\\\\\.]+))\\.[^\\.]+$", "$1" );

当fileNameWithExt包含标准路径时,此方法也适用。

答案 13 :(得分:0)

从相对路径或完整路径获取名称的最简单方法是使用

import org.apache.commons.io.FilenameUtils; FilenameUtils.getBaseName(definitionFilePath)

答案 14 :(得分:0)

流利的方式:

public static String fileNameWithOutExt (String fileName) {
    return Optional.of(fileName.lastIndexOf(".")).filter(i-> i >= 0)
            .map(i-> fileName.substring(0, i)).orElse(fileName);
}

答案 15 :(得分:0)

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("."));
    }

答案 16 :(得分:0)

你可以用“。”拆分它。并且在索引0上是文件名,在1上是扩展名,但我倾向于使用来自apache.commons-io的FileNameUtils的最佳解决方案,就像在第一篇文章中提到的那样。它不必被删除,但足够的是:

String fileName = FilenameUtils.getBaseName("test.xml");

答案 17 :(得分:-1)

使用 Apache Commons IO

中的FilenameUtils.removeExtension

示例:

您可以提供完整路径名或仅提供文件名

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

希望这对您有帮助。

答案 18 :(得分:-3)

尝试以下代码。使用核心Java基本功能。它使用扩展名String来处理,没有扩展名(没有'.'字符)。还涵盖了多个'.'的情况。

String str = "filename.xml";
if (!str.contains(".")) 
    System.out.println("File Name=" + str); 
else {
    str = str.substring(0, str.lastIndexOf("."));
    // Because extension is always after the last '.'
    System.out.println("File Name=" + str);
}

您可以调整它以使用null字符串。