在Java中获取文件扩展的可靠方法是什么?
我不是在谈论在substring/ lastIndexOf .上File.getName(),因为它在复杂的扩展上是无用的,例如.tar.gz等等.(这就是那里的所有库(Commons IO,Guava等)似乎都在做的事情.我正在寻找一种更复杂/可靠的方法,它可以返回真正的扩展.
虽然这听起来像是许多其他问题的重复,但它并不相同.其他海报一直很满意一个简单的答案lastIndexOf ..这会破坏扩展名由多个点组成的情况.
是不是只有一种方法可以用来返回这个?
任何提示将不胜感激.
在Java中获取文件扩展的可靠方法是什么?
没有可靠的方法,因为没有可靠的方法来区分文件后缀和其中包含点(句点)字符的文件名.
换句话说,"真正的"扩展是由人类读者放置文件名的结构.而且我认为你会发现不同的人会有不同的结构.("foo.tar.gz"的真正扩展名是"gz"或"tar.gz",具体取决于您的观点......以及应用程序的目的.)
你可以做的最好的事情是编写你的应用程序,使用"第一个点之后的东西"或"最后一个点之后的东西"作为后缀,这取决于它需要什么.(也许有一些过滤来区分预期的扩展和应用程序不理解的东西.)
然后有一个问题,文件扩展名(但是你提取它)不是文件格式/含义的可靠指标.您可以尝试使用Apache Tika之类的东西来确定格式.然而,即使这可能是有问题的,如果格式未被识别,或者(更糟)如果给定文件有多种可能的格式.
久违的foo.tar.gz例子,据我所知,这依赖于文件扩展名的唯一方案是gunzip将解压缩命令foo.tar.gz的foo.tar.该tar命令本身是无关的文件扩展名:
-z或--gzip或等效选项,无论扩展的.大多数UNIX/Linux程序同样不受文件扩展的影响.