当前位置: 首页 > 科技观察

Java获取文件类型的5种方法

时间:2023-03-12 14:03:10 科技观察

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","");结论:根据文件扩展名判断。3.使用MimeTypesFileTypeMap这个类是Java6自带的,所以在使用JDK1.6的时候非常方便。publicvoidtest(){Filefile=newFile("product.png");MimetypesFileTypeMapfileTypeMap=newMimetypesFileTypeMap();StringmimeType=fileTypeMap.getContentType(file.getName());}结果:这里我们可以获取文件名或File实例本身传递给函数的参数。但是,将File实例作为参数的函数在内部调用接受文件名作为参数的重载方法。在内部,此方法查找名为mime.types的文件以进行类型解析。请务必注意,此方法按特定顺序搜索文件:以编程方式将条目添加到用户主目录中的mime.types/lib/mime.types中,以获取名为META-INF/mime.types的MimetypesFileTypeMap实例资源-INFINF/mimetypes.default(通常只能在activation.jar文件中找到)但是,如果找不到该文件,它将返回application/octet-stream作为响应。结论:根据文件扩展名判断。4.使用jmimemagicjMimeMagic是一个有限制许可的库,我们可以用它来获取文件的MIME类型。配置Maven依赖:net.sf.jmimemagicjmimemagic0.1.5下面我们就来讨论一下如何使用这个库:publicvoidtest(){Filefile=newFile("d:/test.doc");MagicMatchmatch=Magic.getMagicMatch(file,false);System.out.println(match.getMimeType());}这个库可以处理数据流,因此文件不需要存在于文件系统中。结果:结论:根据文件流中的前几个字符判断。5.使用ApacheTikaApacheTika是一个工具集,可以从各种文件中检测和提取元数据和文本。它具有丰富而强大的API,并带有[tika-core],我们可以利用它来检测文件的MIME类型。配置Maven依赖:org.apache.tikatika-core1.18接下来,我们将使用detect()方法解析类型:publicvoidwhenUsingTika_thenSuccess(){Filefile=newFile("d:/test.doc");Tikatika=newTika();StringmimeType=tika.detect(file);}结果:结论:根据前几个文件文件流中的字符判断。总结根据判断原则,总结分类如下:如何选择,根据需要。参考:https://www.baeldung.com/java-file-mime-type