我将对此进行尝试,使用双参数版本,以删除一些特殊情况的检查代码,并希望使意图更具可读性。感谢Justin 'jinguy' Nelson提供了这种方法的基础:lastIndexOf
public static String removeExtention(String filePath) {
// These first few lines the same as Justin's
File f = new File(filePath);
// if it's a directory, don't remove the extention
if (f.isDirectory()) return filePath;
String name = f.getName();
// Now we know it's a file - don't need to do any special hidden
// checking or contains() checking because of:
final int lastPeriodPos = name.lastIndexOf('.');
if (lastPeriodPos <= 0)
{
// No period after first character - return name as it was passed in
return filePath;
}
else
{
// Remove the last period and everything after it
File renamed = new File(f.getParent(), name.substring(0, lastPeriodPos));
return renamed.getPath();
}
}
对我来说,这比特殊大小写的隐藏文件和不包含点的文件更清晰。它也读起来更清楚,我理解你的规格是什么;类似于“删除最后一个点及其后面的所有内容,假设它存在并且不是文件名的第一个字符”。
请注意,此示例还暗示字符串作为输入和输出。由于大多数抽象都需要对象,因此如果这些也是输入和输出,则会稍微清楚一些。File