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

car*_*ing 0 java path

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

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

虽然这听起来像是许多其他问题的重复,但它并不相同.其他海报一直很满意一个简单的答案lastIndexOf ..这会破坏扩展名由多个点组成的情况.

是不是只有一种方法可以用来返回这个?

任何提示将不胜感激.

Ste*_*n C 5

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

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

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

你可以做的最好的事情是编写你的应用程序,使用"第一个点之后的东西"或"最后一个点之后的东西"作为后缀,这取决于它需要什么.(也许有一些过滤来区分预期的扩展和应用程序不理解的东西.)


然后有一个问题,文件扩展名(但是你提取它)不是文件格式/含义的可靠指标.您可以尝试使用Apache Tika之类的东西来确定格式.然而,即使这可能是有问题的,如果格式未被识别,或者(更糟)如果给定文件有多种可能的格式.


久违的foo.tar.gz例子,据我所知,这依赖于文件扩展名的唯一方案是gunzip将解压缩命令foo.tar.gzfoo.tar.该tar命令本身是无关的文件扩展名:

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

大多数UNIX/Linux程序同样不受文件扩展的影响.