Java获取文件Content-Type的四种方法
有时候我们需要获取本地文件的Content-Type,已知 Jdk 自带了三种方式来获取文件类型。
另外还有第三方包 Magic 也提供了API。Magic依赖:
<dependency>
<groupId>net.sf.jmimemagic</groupId>
<artifactId>jmimemagic</artifactId>
<version>0.1.4</version>
</dependency>
下面我们来通过单元测试看下这四种方式的效果。主要代码:
@Test
public void test() {
String pathname = "D:\\...";
try {
Magic parser = new Magic() ;
MagicMatch match = parser.getMagicMatch(new File(pathname),false);
System.out.println("第一种Magic: " + match.getMimeType()) ;
} catch (MagicParseException e) {
e.printStackTrace();
} catch (MagicMatchNotFoundException e) {
e.printStackTrace();
} catch (MagicException e) {
e.printStackTrace();
}
String type = new MimetypesFileTypeMap().getContentType(new File(pathname));
System.out.println("第二种javax.activation: "+type);
try {
String s = Files.probeContentType(new File(pathname).toPath());
System.out.println("第三种java.nio: "+s);
} catch (IOException e) {
e.printStackTrace();
}
FileNameMap fileNameMap = URLConnection.getFileNameMap();
String contentType = fileNameMap.getContentTypeFor(pathname);
System.out.println("第四种java.net: "+contentType);
}
首先,新建文本文件更名为new.json,测试。
log4j:WARN No appenders could be found for logger (net.sf.jmimemagic.Magic).
log4j:WARN Please initialize the log4j system properly.
net.sf.jmimemagic.MagicMatchNotFoundException
....
第二种javax.activation: application/octet-stream
第三种java.nio: null
第四种java.net: null
可以看到,Magic直接抛了异常。javax.activation提示不知道的二进制流。nio 和 net 报null。就此次来说,第2,3, 4种方法对未知类型的处理都可以。唯有第一种不令人满意。
接下来随便写入字符串到new.json文件。然后运行。
第一种Magic: text/plain
第二种javax.activation: application/octet-stream
第三种java.nio: null
第四种java.net: null
Magic提示的是文本类型,javax.activation提示不知道的二进制流。nio 和 net 方式直接为null。Magic胜出。
接下来把new.json文件改名为new.xml文件。再次运行。
第一种Magic: text/plain
第二种javax.activation: application/octet-stream
第三种java.nio: text/xml
第四种java.net: application/xml
javax.activation又提示不知道的二进制流。其它几个提示的都差不多是文本类型,还算靠谱。
再把文件更名为new.html,运行。
第一种Magic: text/plain
第二种javax.activation: text/html
第三种java.nio: text/html
第四种java.net: text/html
可以看到,除了Magic提示文本类型,其它都是html,很准确。
再次把文件改为new.png,运行。
第一种Magic: text/plain
第二种javax.activation: application/octet-stream
第三种java.nio: image/png
第四种java.net: image/png
我们再把pathname改为一张真实图片的地址,运行。
第一种Magic: image/png
第二种javax.activation: application/octet-stream
第三种java.nio: image/png
第四种java.net: image/png
这时Magic的运行结果和上次又不相同。可见,Magic并不是通过文件扩展名来对文件类型进行判定的。
总结
nio 和 net的方式区别不大。Magic的异常需要注意。javax.activation大部分只报application/octet-stream。
建议使用nio 与javax.activation 结合的方法。代码如下:
public String getContentType() {
//利用nio提供的类判断文件ContentType
Path path = Paths.get(getUri());
String content_type = null;
try {
content_type = Files.probeContentType(path);
} catch (IOException e) {
logger.error("Read File ContentType Error");
}
//若失败则调用另一个方法进行判断
if (content_type == null) {
content_type = new MimetypesFileTypeMap().getContentType(new File(getUri()));
}
return content_type;
}
Java获取文件Content-Type的四种方法的更多相关文章
- JAVA中获取文件MD5值的四种方法
JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...
- PHP获取文件后缀名的三种方法
如下: <? PHP获取文件后缀名的几种方法1: function get_file_type($filename){ $type = substr($filename, strrpos($fi ...
- PHP中获取文件扩展名的N种方法
PHP中获取文件扩展名的N种方法 从网上收罗的,基本上就以下这几种方式: 第1种方法:function get_extension($file){substr(strrchr($file, '.'), ...
- MYSQL获取自增ID的四种方法
MYSQL获取自增ID的四种方法 1. select max(id) from tablename 2.SELECT LAST_INSERT_ID() 函数 LAST_INSERT_ID 是与tabl ...
- java 获取键盘输入常用的两种方法
java 获取键盘输入常用的两种方法 方法1: 通过 Scanner Scanner input = new Scanner(System.in); String s = input.nextLine ...
- YSQL获取自增ID的四种方法(转发)
YSQL获取自增ID的四种方法(转发) 1. select max(id) from tablename 2.SELECT LAST_INSERT_ID() 函数 LAST_INSERT_ID 是与t ...
- DBS-MySQL:MYSQL获取自增ID的四种方法
ylbtech-DBS-MySQL:MYSQL获取自增ID的四种方法 1.返回顶部 1. 1. select max(id) from tablename 2.SELECT LAST_INSERT_I ...
- 史上最全的 jmeter 获取 jdbc 数据使用的四种方法
jmeter使用jdbc协议获取数据库中数据,很多人都会用,因为大家在做测试的时候,有时候需要大量的用户进行登录,获取需要数据库中真实的数据用于测试,所以常常会用jdbc来获取数据库数据. 那从数据库 ...
- java交换两个参数值的四种方法
第一种:添加中间变量,算是最经典最简易的一种了. //添加一个中间变量 int x = 1, y = 2; int z; z = x;x = y;y = z; System.out.println(x ...
- Java读取文件夹大小的6种方法及代码
(一)单线程递归方式 package com.taobao.test; import java.io.File; public class TotalFileSizeSequential { publ ...
随机推荐
- FreeSWITCH1.6安装教程Centos
介绍 FreeSWITCH是个网络电话转化器,相当与网络转换器,不过这个是用于IP电话,构建公司的电话通讯系统需要用该技术,因为按照官方文档无法成功安装. 本文目的:FreeSWITCH安装步骤 官方 ...
- 微信小程序 text属性设置 WXSS样式
>微信小程序的布局css样式 参考自 珺L 文字 width: fit-content;font-size:20px; /*设置文字字号*/color:red; ...
- (办公)rom包
所谓ROM包,通俗点来讲,也就是手机上的系统安装包.使用过智能手机的朋友可能都有过这样的遗憾,自己所用的官方系统虽然能够满足绝大部分的需求,但总有一些细节不是很合自己的心愿……比如说,内置的输入法不好 ...
- html + css3 demo
最近,在做一个比较大的网站,主要服务于欧美地区,全站为英文版本,因为是电子产品,因此,要展示产品内在美(扯个蛋!)仿照小米.錘子.苹果等网站,着重于css3动效效果,搜集整理了一些网站中用到的动效图, ...
- mysql之数据备份与恢复
本文内容: 复制文件法 利用mysqldump 利用select into outfile 其它(列举但不介绍) 首发日期:2018-04-19 有些时候,在备份之前要先做flush tables , ...
- Javascript模版引擎mustache.js简介
背景 最近使用ELK的sentinl进行告警配置,sentinl的邮件通知支持mustache,借此机会学习了mustache相关知识,记录在此. mustache的思想 mustache的核心是标签 ...
- LeetCode题解之 Find the Town Judge
1.题目描述 2.问题分析 使用map set数据结构. 3.代码 int findJudge(int N, vector<vector<int>>& trust) { ...
- NUMA导致的Oracle性能问题
背景简介: Oracle版本:11.2.0.4 OS 版本:OEL5.8 在一次Oracle的Dataguard正常switchover过程中,遇到了一个极其诡异的问题,一条主业务的SQL语句在新主库 ...
- SQL 一列拆分多行
select a.col1,b.col2 from (select col1,col2=convert(xml,' <root> <v>'+replace(col2,',',' ...
- chmod、acl权限
R:4W:2X:1 chmod g+r file 给所有者的组内用户加上读的权限chmod o+r file 给其他组用户加上读的权限chmod a+x file 给所有用户加上写执行的权限chmod ...