1.根据文件扩展名判断
优点:速度快,代码简单
缺点:无法判断出真实的文件类型,例如一些伪造的文件或者没有后缀名称的文件
2.根据文件流中前几个字符判断
优点:可以判断出真实的文件类型
缺点:速度慢,代码复杂
下面我会针对每个方法,去测试验证,测试文件如下:
test.png: 创建一个正常的png文件,其扩展名为test.png
test.doc: 复制一份上面的test.png文件,修改其文件名称为test.doc
1. 使用Files.probeContentType
Java1.7开始,提供了用于解决MIME类型的方法 Files.probeContentType:
public static void test() throws IOException { Path path = new File("d:/test.png").toPath(); String mimeType = Files.probeContentType(path); System.out.println(mimeType); }
结果:
此方法利用已安装的FileTypeDetector实现来探查MIME类型。它调用每个实现的 probeContentType来解析类型。
但是,其默认实现是特定于操作系统的,并且可能会失败,具体取决于我们使用的操作系统。
结论:根据文件扩展名判断。
2. 使用URLConnection
URLConnection提供了几种用于检测文件的MIME类型的API。
2.1 使用getContentType
public void test(){ File file = new File("d:/test.png"); URLConnection connection = file.toURL().openConnection(); String mimeType = connection.getContentType(); }
结果:
结论:根据文件流中前几个字符判断。能够判断真实的文件类型,但是,这种方法的主要缺点是速度非常慢。
2.2 使用guessContentTypeFromName
public void test(){ File file = new File("d:/test.png"); String mimeType = URLConnection.guessContentTypeFromName(file.getName()); }
结果:
该方法利用内部的FileNameMap来判断MIME类型。
结论:根据文件扩展名判断。
2.3 使用guessContentTypeFromStream
public static void test() throws Exception { FileInputStream inputFile = new FileInputStream("d:/test.doc"); String mimeType = URLConnection.guessContentTypeFromStream(new BufferedInputStream(inputFile)); System.out.println(mimeType); }
结果:
结论:根据文件流中前几个字符判断。
2.4 使用getFileNameMap
使用URLConnection获得MIME类型的更快方法是使用getFileNameMap()方法:
public void test(){ File file = new File("d:/test.png"); FileNameMap fileNameMap = URLConnection.getFileNameMap(); String mimeType = fileNameMap.getContentTypeFor(file.getName()); }
结果:
该方法返回URLConnection的所有实例使用的MIME类型表。然后,该表用于解析输入文件类型。
当涉及URLConnection时,MIME类型的内置表非常有限。
默认情况下,该类使用content-types.properties文件,其所在目录为JRE_HOME/lib。但是,我们可以通过使用content.types.user.table属性指定用户特定的表来扩展它 :
System.setProperty("content.types.user.table","<path-to-file>");</path-to-file>
结论:根据文件扩展名判断。
3. 使用MimeTypesFileTypeMap
该类是Java 6附带的,因此在使用JDK 1.6时非常方便。
public void test() { File file = new File("product.png"); MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap(); String mimeType = fileTypeMap.getContentType(file.getName()); }
结果:
在这里,我们可以将文件名或File实例本身作为参数传递给函数。但是,以File实例为参数的函数在内部调用重载方法,该方法接受文件名作为参数。
在内部,此方法查找名为mime.types的文件以进行类型解析。请务必注意,该方法以特定顺序搜索文件:
鸿蒙官方战略合作共建——HarmonyOS技术社区
以编程方式将条目添加到MimetypesFileTypeMap实例
用户主目录中的mime.types
名为META-INF / mime.types的资源
名为META-INF / mimetypes.default的资源(通常仅在activation.jar文件中找到)
但是,如果找不到文件,它将返回application/octet-stream作为响应。
结论:根据文件扩展名判断。
4. 使用jmimemagicjMimeMagic
是一个受限制许可的库,我们可以使用它来获取文件的MIME类型。
配置Maven依赖:
<dependency> <groupid>net.sf.jmimemagic</groupid> <artifactid>jmimemagic</artifactid> <version>0.1.5</version> </dependency>
接下来,我们将探讨如何使用该库:
public void test() { File file = new File("d:/test.doc"); MagicMatch match = Magic.getMagicMatch(file, false); System.out.println(match.getMimeType()); }
该库可以处理数据流,因此不需要文件存在于文件系统中。
结果:
结论:根据文件流中前几个字符判断。
5. 使用Apache TikaApache Tika
是一个工具集,可检测并从各种文件中提取元数据和文本。它具有丰富而强大的API,并带有[tika-core],我们可以利用它来检测文件的MIME类型。
配置Maven依赖:
<dependency> <groupid>org.apache.tika</groupid> <artifactid>tika-core</artifactid> <version>1.18</version> </dependency>
接下来,我们将使用detect()方法来解析类型:
public void whenUsingTika_thenSuccess() { File file = new File("d:/test.doc"); Tika tika = new Tika(); String mimeType = tika.detect(file); }
结果:
结论:根据文件流中前几个字符判断。
以上是Java如何判断文件类型的详细内容。更多信息请关注PHP中文网其他相关文章!

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于结构化数据处理开源库SPL的相关问题,下面就一起来看一下java下理想的结构化数据处理类库,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于PriorityQueue优先级队列的相关知识,Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlockingQueue是线程安全的,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于java锁的相关问题,包括了独占锁、悲观锁、乐观锁、共享锁等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于多线程的相关问题,包括了线程安装、线程加锁与线程不安全的原因、线程安全的标准类等等内容,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于枚举的相关问题,包括了枚举的基本操作、集合类对枚举的支持等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于Java的相关知识,其中主要介绍了关于关键字中this和super的相关问题,以及他们的一些区别,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于java的相关知识,其中主要介绍了关于平衡二叉树(AVL树)的相关知识,AVL树本质上是带了平衡功能的二叉查找树,下面一起来看一下,希望对大家有帮助。

封装是一种信息隐藏技术,是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法;封装可以被认为是一个保护屏障,防止指定类的代码和数据被外部类定义的代码随机访问。封装可以通过关键字private,protected和public实现。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Dreamweaver Mac版
视觉化网页开发工具