Java获取文件类型的5种方式:速度快,代码简单缺点:无法判断真正的文件类型,比如一些假文件或者没有后缀名的文件速度慢,代码复杂。接下来,我将对每个方法进行测试和验证。测试文件如下:test.png:新建一个普通的png文件,扩展名为test.pngtest.doc:复制上面的test.png文件,修改文件名为test.doc1。开始使用Files.probeContentTypeJava1.7提供了解决MIME类型Files.probeContentType的方法:publicstaticvoidtest()throwsIOException{Pathpath=newFile("d:/test.png").toPath();StringmimeType=Files.probeContentType(path);System.out.println(mimeType);}结果:此方法利用已安装的FileTypeDetector实现来探测MIME类型。它调用每个实现的probeContentType来解析类型。但是,它的默认实现是特定于操作系统的,并且可能会失败,具体取决于我们使用的操作系统。结论:根据文件扩展名判断。2.使用URLConnectionURLConnection提供了几个用于检测文件MIME类型的API。2.1使用getContentTypepublicvoidtest(){Filefile=newFile("d:/test.png");URLConnectionconnection=file.toURL().openConnection();StringmimeType=connection.getContentType();}结果:结论:根据previous从几个字符来看。可以确定真实的文件类型,但是,这种方法的主要缺点是速度非常慢。2.2使用guessContentTypeFromNamepublicvoidtest(){Filefile=newFile("d:/test.png");StringmimeType=URLConnection.guessContentTypeFromName(file.getName());}结果:该方法使用内部的FileNameMap来判断MIME类型。结论:根据文件扩展名判断。2.3使用guessContentTypeFromStreampublicstaticvoidtest()throwsException{FileInputStreaminputFile=newFileInputStream("d:/test.doc");StringmimeType=URLConnection.guessContentTypeFromStream(newBufferedInputStream(inputFile));System.out.println(mimeType);}结果:结论:根据对文件流中间的前几个字符进行判断。2.4使用getFileNameMap使用URLConnection获取MIME类型的更快方法是使用getFileNameMap()方法:publicvoidtest(){Filefile=newFile("d:/test.png");FileNameMapfileNameMap=URLConnection.getFileNameMap();StringmimeType=fileNameMap.getContentTypeFor(file.getName());}结果:该方法返回URLConnection的所有实例使用的MIME类型列表。然后使用该表来解析输入文件类型。对于URLConnection,内置的MIME类型表非常有限。默认情况下,此类使用位于JRE_HOME/lib中的content-types.properties文件。但是,我们可以通过使用content.types.user.table属性指定特定于用户的表来扩展它:System.setProperty("content.types.user.table","
