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