在Java中,最有效的方式是什么来截取后缀,例如:
title part1.txt
title part2.html
=>
title part1
title part2
这种代码我们不应该自己去做。使用库来处理平凡无奇的事情,为难点留下你的大脑。
在这种情况下,我建议使用Apache Commons IO中的FilenameUtils.removeExtension()
方法来移除文件扩展名。
str.substring(0, str.lastIndexOf('.'))
str
包含小数点时,取出最后一个小数点前的字符串:if(str.contains(".")) str.substring(0, str.lastIndexOf('.'))
。 - string.Empty使用String.substring
和String.lastIndexOf
作为一行代码是不错的,但在处理某些文件路径时会出现问题。
以以下路径为例:
a.b/c
使用这个单行命令将会得到:
a
这是不正确的。
结果应该是c
,但由于文件缺少扩展名,而路径中有一个带有.
的目录,因此单行方法被欺骗为将路径的一部分作为文件名,这是不正确的。
需要进行检查
受 skaffman答案 的启发,我研究了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
结果是测试中所述的期望结果,该方法应满足这些期望结果。
System.getProperty("file.separator")
而不是只用 File.separator
,有特别的原因吗? - halirutan/path/to/.htaccess
这个路径,它将会失败。 - Kuzeko顺便说一下,在我的情况下,当我想要快速删除特定扩展名时,这大概是我所做的:
if (filename.endsWith(ext))
return filename.substring(0,filename.length() - ext.length());
else
return filename;
String foo = "title part1.txt";
foo = foo.substring(0, foo.lastIndexOf('.'));
你可以尝试这个函数,非常基础
public String getWithoutExtension(String fileFullPath){
return fileFullPath.substring(0, fileFullPath.lastIndexOf('.'));
}
com.google.common.io.Files
类中的方法。您需要使用的方法是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);
}
这是一个恶作剧的问题吗? :p
目前我想不到更快的方法了。
filename.substring(filename.lastIndexOf('.'), filename.length()).toLowerCase();
我发现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" 而不是 "Test"