我需要从文件名中提取扩展名。
我知道这可以通过使用.gz或使用像Apache commons-io 这样的实用程序方法来完成。.tarfilePath.lastIndexOf('.')FilenameUtils.getExtension(filePath)
但是,如果我有一个带有类似扩展名的文件.tar.gz怎么办?如何管理扩展名包含.字符的文件?
我需要从文件名中提取扩展名。
我知道这可以通过使用.gz或使用像Apache commons-io 这样的实用程序方法来完成。.tarfilePath.lastIndexOf('.')FilenameUtils.getExtension(filePath)
但是,如果我有一个带有类似扩展名的文件.tar.gz怎么办?如何管理扩展名包含.字符的文件?
如果您知道哪些扩展很重要,您可以简单地明确检查它们。您将拥有一组已知扩展,如下所示:
List<String> EXTS = Arrays.asList("tar.gz", "tgz", "gz", "zip");
您可以获得(第一个)最长的匹配扩展,如下所示:
String getExtension(String fileName) {
String found = null;
for (String ext : EXTS) {
if (fileName.endsWith("." + ext)) {
if (found == null || found.length() < ext.length()) {
found = ext;
}
}
}
return found;
}
所以调用getExtension("file.tar.gz")会返回"tar.gz"。
如果您有混合大小写的名称,也许尝试将检查更改为filename.toLowerCase().endsWith("." + ext)循环内部。
一个文件只能有一个扩展名!
如果你有一个文件test.tar.gz,
.gz是扩展和test.tar是基本名称!.tar在这种情况下是基本名称的一部分,而不是扩展名的一部分!
如果您喜欢将文件编码为tar,gz则应将其命名为.tgz. 使用 a.tar.gz是不好的做法,如果您需要处理这些文件,您应该采取一种解决方法,例如将文件重命名为test.tgz.
找到了一个简单的方法。用于substring仅获取文件名,indexOf而不是lastIndexOf获取第一个 '.' 并在其后扩展
您可以获取路径的文件名部分,拆分.并将数组中的最后 0、1 或 2 个元素作为扩展名。
当然,如果.tar.*(gz、bz2 等)是您唯一的极端情况,那么构建一个过滤 .tar 文件名的解决方案可能是务实的。并将其用作提取扩展名的点(包括 .tar 部分)。