在 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.gz
为 foo.tar
。 tar
命令本身与文件扩展名无关:
- 它将把任何文件作为 TAR 文件读取,无论扩展名如何。
- 如果 TAR 文件经过压缩(使用 gzip 压缩),则您需要提供
-z
或--gzip
或等效选项,无论扩展名如何。
大多数 UNIX/Linux 程序同样不知道文件扩展名。
关于java - 获取文件扩展名的可靠方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33080364/