明确一点,我并不是在寻找MIME类型。
假设我有以下输入:/path/to/file/foo.txt
我想要一种方法来分解这个输入,特别是扩展为.txt。在Java中有任何内置的方法来做到这一点吗?我希望避免编写自己的解析器。
明确一点,我并不是在寻找MIME类型。
假设我有以下输入:/path/to/file/foo.txt
我想要一种方法来分解这个输入,特别是扩展为.txt。在Java中有任何内置的方法来做到这一点吗?我希望避免编写自己的解析器。
当前回答
下面是一个正确处理.tar.gz的方法,即使是在目录名中有点的路径中:
private static final String getExtension(final String filename) {
if (filename == null) return null;
final String afterLastSlash = filename.substring(filename.lastIndexOf('/') + 1);
final int afterLastBackslash = afterLastSlash.lastIndexOf('\\') + 1;
final int dotIndex = afterLastSlash.indexOf('.', afterLastBackslash);
return (dotIndex == -1) ? "" : afterLastSlash.substring(dotIndex + 1);
}
创建afterLastSlash是为了更快地查找afterLastBackslash,因为如果字符串中有一些斜杠,它就不必搜索整个字符串。
原始String中的char[]被重用,没有在那里添加垃圾,JVM可能会注意到afterLastSlash立即是垃圾,以便将其放在堆栈而不是堆上。
其他回答
从所有其他答案中可以明显看出,没有足够的“内置”函数。这是一种安全简单的方法。
String getFileExtension(File file) {
if (file == null) {
return "";
}
String name = file.getName();
int i = name.lastIndexOf('.');
String ext = i > 0 ? name.substring(i + 1) : "";
return ext;
}
下面是一个正确处理.tar.gz的方法,即使是在目录名中有点的路径中:
private static final String getExtension(final String filename) {
if (filename == null) return null;
final String afterLastSlash = filename.substring(filename.lastIndexOf('/') + 1);
final int afterLastBackslash = afterLastSlash.lastIndexOf('\\') + 1;
final int dotIndex = afterLastSlash.indexOf('.', afterLastBackslash);
return (dotIndex == -1) ? "" : afterLastSlash.substring(dotIndex + 1);
}
创建afterLastSlash是为了更快地查找afterLastBackslash,因为如果字符串中有一些斜杠,它就不必搜索整个字符串。
原始String中的char[]被重用,没有在那里添加垃圾,JVM可能会注意到afterLastSlash立即是垃圾,以便将其放在堆栈而不是堆上。
如果你在项目中使用Spring框架,那么你可以使用StringUtils
import org.springframework.util.StringUtils;
StringUtils.getFilenameExtension("YourFileName")
只是一个基于正则表达式的替代方案。没那么快,也没那么好。
Pattern pattern = Pattern.compile("\\.([^.]*)$");
Matcher matcher = pattern.matcher(fileName);
if (matcher.find()) {
String ext = matcher.group(1);
}
如果在Android上,你可以使用这个:
String ext = android.webkit.MimeTypeMap.getFileExtensionFromUrl(file.getName());