获取特殊情况下的文件扩展名,例如tar.gz。

8

我需要从文件名中提取扩展名。

对于单个扩展名如.gz.tar,可以使用filePath.lastIndexOf('.')或使用Apache Commons-IO的实用程序方法FilenameUtils.getExtension(filePath)来完成。

但是,如果我有一个具有像.tar.gz这样的扩展名的文件呢? 如何管理包含.字符的扩展名的文件?


4
实际上,扩展名不是.tar.gz。按照定义,扩展名是.gz.tar只是为了提供信息。如果文件以.test.zip结尾,您会认为扩展名是.zip,对吗? - Thorsten Dittmar
1
在编程中,如果出现commons-io-2.4.jar,你会期望发生什么? - vels4j
@ThorstenDittmar,像*.tgz一样处理*.tar.gz仍然是合理的,请注意。 - Ingo
哦,这是真的,我没有意识到@ThorstenDittmar。那么.tar.gz和.gz在这种情况下具有相同的文件属性(例如图标)吗? - Bernice
1
为什么这个问题会被关闭?据我所见,这个问题很合理,并且“展示了对问题的最小理解”。肯定有足够的信息可以让我提供一个答案,而且该答案已经被接受。我稍微编辑了一下问题以澄清这一点,并且该编辑已经被接受。 - grkvlt
显示剩余3条评论
4个回答

5

如果您知道哪些扩展很重要,您可以直接对它们进行检查。您将拥有已知扩展名的集合,就像这样:

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)


4

一个文件只能有一个扩展名!

如果你有一个名为test.tar.gz的文件,

  • .gz是扩展名,
  • test.tar是文件名(也称为Basename)!

在这种情况下,.tar是文件名的一部分,而不是扩展名的一部分!

如果您想将文件编码为targz,则应将其命名为.tgz。 使用.tar.gz是不好的做法,如果您需要处理这些文件,则应该采用解决方法,例如将文件重命名为test.tgz


1
不同意: “扩展名” 是某个应用程序定义的任何东西。从操作系统的角度来看,不存在所谓的“扩展名”。 - Ingo
从操作系统的角度来看,嗯...也许更准确地说是从文件系统的角度来看。 - Grim
1
如果您将文件重命名为uuid +扩展名,这并没有帮助,您将从foo.tar.gz变为61822326-ef4d-49f4-971d-b20269c72db9.gz... - Enerccio

0
找到了一个简单的方法。使用 substring 来获取文件名,使用 indexOf 而不是 lastIndexOf 来获取第一个 '.' 和其后面的扩展名。

2
如果我给你一个名为 program.logs.tar.gz 的文件,你的程序会认为它的扩展名是什么? - Thorsten Dittmar
同意,对于嵌入版本号等内容的文件,这种方法行不通。 - grkvlt

0

你可以获取路径中的文件名部分,以 . 为分隔符拆分,并将数组中的最后0、1或2个元素视为扩展名。

当然,如果 .tar.* (gz、bz2等)是您唯一需要考虑的情况,那么构建一个过滤掉文件名中. tar的解决方案并将其用作提取扩展名的点(包括.tar部分)可能是实用的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接