【问题标题】:A reliable way to the get the extension of a file获取文件扩展名的可靠方法
【发布时间】:2016-01-09 21:17:44
【问题描述】:

在 Java 中获取文件扩展名的可靠方法是什么?

我不是在谈论在File.getName() 上执行substring / lastIndexOf .,因为它对复杂的扩展名无用,例如.tar.gz 等。 (这是所有库(Commons IO、Guava 等)似乎都在做的事情。我正在寻找一种更复杂/可靠的方法来返回真正的扩展。

虽然这听起来像这里的许多其他问题的重复,但它并不相同。其他发帖人对lastIndexOf . 的简单回答很满意。这打破了扩展由多个点组成的情况。

难道没有简单的方法可以用来返回这个吗?

任何提示将不胜感激。

【问题讨论】:

  • 从技术上讲,.tar.gz.gz.tar methinks。
  • 请定义“真正的扩展”。
  • 只要. 可以由用户输入作为文件名的一部分,怎么可能?没有人阻止我创建一个名为 my.file.name.that.has.dots.txt 的文件——谁能知道扩展名和文件名是什么?
  • @Thomas 这就是为什么 OP 提到 lastIndexOf 将返回最后一个点的位置。

标签: java path


【解决方案1】:

在 Java 中获取文件扩展名的可靠方法是什么?

没有可靠的方法,因为没有可靠的方法来区分文件后缀和包含点(句点)字符的文件名。

或者换句话说,“真正的”扩展名是由人类读者放置文件名的结构。我想你会发现不同的人会放置不同的结构。 (“foo.tar.gz”的真正扩展名是“gz”或“tar.gz”,这取决于您的观点......以及应用程序的设计目的。)

您能做的最好的事情就是将您的应用程序编码为使用“第一个点之后的内容”或“最后一个点之后的内容”作为后缀,具体取决于它的需要。 (并且可能会进行一些过滤,以区分预期的扩展和应用程序不理解的内容。)


还有一个问题是文件扩展名(无论你如何提取它)不是文件格式/含义的可靠指标。您可以尝试使用 Apache Tika 之类的东西来确定格式。但是,如果格式无法识别,或者(更糟)给定文件有多种可能的格式,即使这样也可能会出现问题。


回到foo.tar.gz 的例子,据我所知,唯一依赖文件扩展名的程序是gunzip 命令,它将foo.tar.gz 解压缩为foo.tartar 命令本身与文件扩展名无关:

  • 无论扩展名如何,它都会将任何文件作为 TAR 文件读取。
  • 如果 TAR 文件被压缩(使用 gzip 压缩),那么您需要提供 -z--gzip 或等效选项,无论扩展名如何。

大多数 UNIX / Linux 程序同样不知道文件扩展名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 2012-06-07
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 2011-10-02
    相关资源
    最近更新 更多