3 回答
TA贡献1871条经验 获得超8个赞
这是我们不应该自己做的代码。将库用于平凡的东西,为硬的东西而动脑子。
在这种情况下,我建议使用FilenameUtils.removeExtension()从Apache的百科全书IO
TA贡献1859条经验 获得超6个赞
由于在单行中使用String.substringand String.lastIndex很好,因此在能够处理某些文件路径方面存在一些问题。
以以下路径为例:
a.b/c
使用单线将导致:
a
不对
结果应该是c,但是由于文件没有扩展名,但是路径中有一个.名称为的目录,因此,单线方法被欺骗为路径的一部分提供文件名,这是不正确的。
需要检查
受skaffman答案的启发,我看了Apache Commons IO的FilenameUtils.removeExtension方法。
为了重新创建其行为,我编写了新方法应满足的一些测试,这些测试如下:
路径文件名
-------------- --------
a / b / cc
a / b / c.jpg c
a / b / c.jpg.jpg c.jpg
绝对/ cc
ab / c.jpg c
ab / c.jpg.jpg c.jpg
抄送
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文字的一部分时,必须使用a对其进行转义。
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
结果是该方法应满足的测试中概述的期望结果。
TA贡献1794条经验 获得超8个赞
顺便说一句,就我而言,当我想要快速解决方案以删除特定扩展名时,这大致就是我所做的:
if (filename.endsWith(ext))
return filename.substring(0,filename.length() - ext.length());
else
return filename;
添加回答
举报