java - 获取文件扩展名的可靠方法

标签 java path

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

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

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

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

如有任何提示,我们将不胜感激。

最佳答案

What's a reliable way to get the extension of a file in Java?

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

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

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

<小时/>

然后存在的问题是文件扩展名(无论您如何提取它)并不是文件格式/含义的可靠指示符。您可以尝试使用 Apache Tika 等工具来确定格式。然而,如果格式无法识别,或者(更糟糕的是)给定文件有多种可能的格式,即使这样也可能会出现问题。

<小时/>

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

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

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

关于java - 获取文件扩展名的可靠方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33080364/

相关文章:

java - 无法使用 maven-assembly-plugin 设置类路径

python - Django 和 South 中的动态文件路径

node.js - 更改 NodeJ 上的路径分隔符

php - 替换 PHP 的 realpath()

git - 为什么 "git clone"在传递本地文件:///url?时打包对象数据库

javafx 颜色解析

java - 如何在jpa中将Map<String, MyValueObject>与xml映射?

graph - 具有最小优先级队列的 Dijkstra 算法

java - Android 上数组中的黑名单字符串

java - .zip 文件上传 Spring