【问题标题】:Get File Extension for special cases like tar.gz [closed]为 tar.gz 等特殊情况获取文件扩展名 [关闭]
【发布时间】:2013-07-16 12:30:10
【问题描述】:

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

我知道这可以通过使用 filePath.lastIndexOf('.') 或使用 Apache commons-io 中的 FilenameUtils.getExtension(filePath) 等实用方法对 .gz.tar 等单个扩展完成。

但是,如果我有一个扩展名为.tar.gz 的文件怎么办?如何管理扩展名包含. 字符的文件?

【问题讨论】:

  • 其实扩展名不是.tar.gz。扩展名——根据定义——是.gz.tar 部分仅供参考。如果文件以.test.zip 结尾,你会考虑扩展名.zip,不是吗?
  • commons-io-2.4.jar 在这种情况下你会期待什么?
  • @ThorstenDittmar 处理 *.tar.gz 仍然是合理的,就像 *.tgz 一样,请注意。
  • 哦,这是真的,我还没有意识到@ThorstenDittmar。那么 .tar.gz 和 .gz 在这种情况下都具有相同的文件属性(例如图标)?
  • 为什么关闭了?这个问题是合理的,并且就我所见,表明[s] 对这个问题有一个最低限度的理解。当然,有足够的信息让我提供答案,然后被接受。我已经稍微编辑了这个问题以澄清这一点,并且编辑已被接受。

标签: java file utility-method


【解决方案1】:

如果您知道哪些扩展很重要,您可以简单地明确检查它们。您将拥有一组已知扩展,如下所示:

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)

【讨论】:

    【解决方案2】:

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

    如果你有文件test.tar.gz

    • .gz 是扩展名,
    • test.tar 是基本名称!

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

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

    【讨论】:

    • 请有所不同:“扩展”是某些应用程序定义的任何内容。从操作系统的角度来看,没有“扩展”之类的东西。
    • A OS pov,嗯...从 FS pov 说,它可能更省钱。
    • 如果您将文件重命名为 uuid + 扩展名,这将无济于事,您将从 foo.tar.gz 获得 61822326-ef4d-49f4-971d-b20269c72db9.gz ...
    【解决方案3】:

    找到一个简单的方法。使用substring 仅获取文件名,使用indexOf 而不是lastIndexOf 获取第一个'.'并在其后扩展

    【讨论】:

    • 如果我给你一个文件program.logs.tar.gz,你的程序会考虑扩展名吗?
    • 同意,这不适用于嵌入了版本号等内容的文件。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 2020-09-12
      • 1970-01-01
      相关资源
      最近更新 更多