HTTP 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的四种方法的更多相关文章

  1. JAVA中获取文件MD5值的四种方法

    JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...

  2. PHP获取文件后缀名的三种方法

    如下: <? PHP获取文件后缀名的几种方法1: function get_file_type($filename){ $type = substr($filename, strrpos($fi ...

  3. PHP中获取文件扩展名的N种方法

    PHP中获取文件扩展名的N种方法 从网上收罗的,基本上就以下这几种方式: 第1种方法:function get_extension($file){substr(strrchr($file, '.'), ...

  4. MYSQL获取自增ID的四种方法

    MYSQL获取自增ID的四种方法 1. select max(id) from tablename 2.SELECT LAST_INSERT_ID() 函数 LAST_INSERT_ID 是与tabl ...

  5. java 获取键盘输入常用的两种方法

    java 获取键盘输入常用的两种方法 方法1: 通过 Scanner Scanner input = new Scanner(System.in); String s = input.nextLine ...

  6. YSQL获取自增ID的四种方法(转发)

    YSQL获取自增ID的四种方法(转发) 1. select max(id) from tablename 2.SELECT LAST_INSERT_ID() 函数 LAST_INSERT_ID 是与t ...

  7. DBS-MySQL:MYSQL获取自增ID的四种方法

    ylbtech-DBS-MySQL:MYSQL获取自增ID的四种方法 1.返回顶部 1. 1. select max(id) from tablename 2.SELECT LAST_INSERT_I ...

  8. 史上最全的 jmeter 获取 jdbc 数据使用的四种方法

    jmeter使用jdbc协议获取数据库中数据,很多人都会用,因为大家在做测试的时候,有时候需要大量的用户进行登录,获取需要数据库中真实的数据用于测试,所以常常会用jdbc来获取数据库数据. 那从数据库 ...

  9. java交换两个参数值的四种方法

    第一种:添加中间变量,算是最经典最简易的一种了. //添加一个中间变量 int x = 1, y = 2; int z; z = x;x = y;y = z; System.out.println(x ...

  10. Java读取文件夹大小的6种方法及代码

    (一)单线程递归方式 package com.taobao.test; import java.io.File; public class TotalFileSizeSequential { publ ...

随机推荐

  1. Pycharm启动后加载anaconda一直updating indices造成Pycharm闪退甚至电脑崩溃

    可能跟anaconda文件夹有一定关系 网上找找解决方案,似乎很多人有同样的困扰! 知乎-pycharm启动后总是不停的updating indices...indexing? stackoverfl ...

  2. HDU 2086 A1 = ? (找规律推导公式 + 水题)(Java版)

    Equations 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2086 ——每天在线,欢迎留言谈论. 题目大意: 有如下方程:Ai = (Ai-1 ...

  3. Linux下对lvm逻辑卷分区大小的调整(针对xfs和ext4不同文件系统)

    当我们在安装系统的时候,由于没有合理分配分区空间,在后续维护过程中,发现有些分区空间不够使用,而有的分区空间却有很多剩余空间.如果这些分区在装系统的时候使用了lvm(前提是这些分区要是lvm逻辑卷分区 ...

  4. linux 命令之netstat

    转自:http://www.maomao365.com/?p=699 linux 命令之netstat 在linux中netstat命令的作用是查看TCP/IP网络当前所开放端口,所对应的本地和外地端 ...

  5. Lua无法排序的问题(Key需要是连续的)

    排序的Key需要是连续的 local x = {[1]={x=6}, [2]={x=5}, [3]={x=7}, [5]={x=2}, [6]={x=8}, [7]={x=5}} ---从小到大排序 ...

  6. JAVA的下载与安装和环境变量配置等详细教程

    初学JAVA时,新手常常不知如何下载JAVA,也不知如何安装JAVA以及对JAVA配置环境变量.近期学弟学妹常请教我如何下载安装和配置JAVA,于是写下此博文以便更多新手快速入门,由于我本人是玩智能车 ...

  7. 【PAT】B1011 A+B 和 C

    注意数据的范围,使用long long就行了 #include<stdio.h> int main(){ int N;scanf("%d",&N); for(i ...

  8. 持续代码质量管理-SonarQube-7.3部署

    Sonar 是一个用于代码质量管理的开放平台.通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具.与持续集成工具(例如 Hudson/Jenkins 等)不同,Sonar ...

  9. LeetCode算法题-Excel Sheet Column Title(Java实现)

    这是悦乐书的第180次更新,第182篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第39题(顺位题号是168).给定正整数,返回Excel工作表中显示的相应列标题.例如: ...

  10. 【存储】RAID磁盘阵列选择

    RAID磁盘阵列(Redundant Arrays of Inexpensive Disks) 一个基本思想:将多个容量较小.相对廉价的磁盘进行有机组合,从而以较低的成本获得与昂贵大容量磁盘相当的容量 ...