判断java文件类型TikaToolKit的实例

引入依赖

<dependency>
  <groupId>org.apache.tika</groupId>
  <artifactId>tika-core</artifactId>
  <version>1.20</version>
</dependency>

compile 'org.apache.tika:tika-core:1.20'

工具类

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.apache.tika.metadata.HttpHeaders;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.metadata.TikaMetadataKeys;
import org.apache.tika.parser.AutoDetectParser;
import org.apache.tika.parser.ParseContext;
import org.xml.sax.helpers.DefaultHandler;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * tika
 *
 * @author zhy
 */
@Slf4j
public class TikaToolUtil {

  /**
   * 获取类型
   *
   * @param file 文件
   * @return String
   */
  public static String getMimeType(File file) {
    if (file.isDirectory()) {
      return "the target is a directory";
    }

    AutoDetectParser parser = new AutoDetectParser();
    parser.setParsers(new HashMap<>());
    Metadata metadata = new Metadata();
    metadata.add(TikaMetadataKeys.RESOURCE_NAME_KEY, file.getName());
    try (InputStream stream = new FileInputStream(file)) {
      parser.parse(stream, new DefaultHandler(), metadata, new ParseContext());
    } catch (Exception e) {
      log.error(e.getMessage());
    }
    return metadata.get(HttpHeaders.CONTENT_TYPE);
  }

  /**
   * 判断是否是图片
   *
   * @param file 文件
   * @return boolean
   */
  public static boolean isImage(File file) {
    String type = getMimeType(file);
    System.out.println(type);
    Pattern p = Pattern.compile(Type.IMAGE.name);
    Matcher m = p.matcher(type);
    return m.matches();
  }

  /**
   * 判断是否是zip
   *
   * @param file 文件
   * @return boolean
   */
  public static boolean isZip(File file) {
    String type = getMimeType(file);
    System.out.println(type);
    Pattern p = Pattern.compile(Type.ZIP.name);
    Matcher m = p.matcher(type);
    return m.matches();
  }

  /**
   * 判断是否是dicom
   *
   * @param file 文件
   * @return boolean
   */
  public static boolean isDicom(File file) {
    String type = getMimeType(file);
    Pattern p = Pattern.compile(Type.DCM.name);
    Matcher m = p.matcher(type);
    return m.matches();
  }

  /**
   * 类型枚举
   */
  @Getter
  @AllArgsConstructor
  public enum Type {
    /**
     * dcm
     */
    DCM("application/dicom"),
    /**
     * zip
     */
    ZIP("application/zip"),
    /**
     * 图片
     */
    IMAGE("image/.*"),
    /**
     * 视频
     */
    VIDEO("video/*");

    private String name;
  }

  public static void main(String[] args) {
    boolean image = isImage(new File("C:\\Users\\zhy\\Desktop\\dcm\\123.dcm"));
    System.out.println("zhy:" + image);
  }
}

补充知识:java根据文件流判断文件类型(后缀名)

我就废话不多说了,大家还是直接看代码吧~

import java.io.FileInputStream;

public class FileType{
  public static String bytesToHexString(byte[] src) {
    StringBuilder stringBuilder = new StringBuilder();
    if (src == null || src.length <= 0) {
      return null;
    }
    for (int i = 0; i < src.length; i++) {
      int v = src[i] & 0xFF;
      String hv = Integer.toHexString(v);
      if (hv.length() < 2) {
        stringBuilder.append(0);
      }
      stringBuilder.append(hv);
    }
    return stringBuilder.toString();
  }

  /**
   * @param args
   */
  public static void main(String[] args) throws Exception {
    FileInputStream is = new FileInputStream("F:\\相册\\微信图片\\03.jpg");
    byte[] b = new byte[3];
    is.read(b, 0, b.length);
    String xxx = bytesToHexString(b);
    xxx = xxx.toUpperCase();
    System.out.println("头文件是:" + xxx);
    String ooo = TypeDict.checkType(xxx);
    System.out.println("后缀名是:" + ooo);

  }
}
public class TypeDict {
/**
 常用文件的文件头如下:(以前六位为准)
JPEG (jpg),文件头:FFD8FF
PNG (png),文件头:89504E47
GIF (gif),文件头:47494638
TIFF (tif),文件头:49492A00
Windows Bitmap (bmp),文件头:424D
CAD (dwg),文件头:41433130
Adobe Photoshop (psd),文件头:38425053
Rich Text Format (rtf),文件头:7B5C727466
XML (xml),文件头:3C3F786D6C
HTML (html),文件头:68746D6C3E
Email [thorough only] (eml),文件头:44656C69766572792D646174653A
Outlook Express (dbx),文件头:CFAD12FEC5FD746F
Outlook (pst),文件头:2142444E
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
MS Access (mdb),文件头:5374616E64617264204A
WordPerfect (wpd),文件头:FF575043
Postscript (eps.or.ps),文件头:252150532D41646F6265
Adobe Acrobat (pdf),文件头:255044462D312E
Quicken (qdf),文件头:AC9EBD8F
Windows Password (pwl),文件头:E3828596
ZIP Archive (zip),文件头:504B0304
RAR Archive (rar),文件头:52617221
Wave (wav),文件头:57415645
AVI (avi),文件头:41564920
Real Audio (ram),文件头:2E7261FD
Real Media (rm),文件头:2E524D46
MPEG (mpg),文件头:000001BA
MPEG (mpg),文件头:000001B3
Quicktime (mov),文件头:6D6F6F76
Windows Media (asf),文件头:3026B2758E66CF11
MIDI (mid),文件头:4D546864
*/
  public static String checkType(String xxxx) {

    switch (xxxx) {
    case "FFD8FF": return "jpg";
    case "89504E": return "png";
    case "474946": return "jif";

    default: return "0000";
    }
  }
}

以上这篇判断java文件类型TikaToolKit的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java 各种数据类型的互相转换实例代码

    StringBuilder转化为String String str = "abcdefghijklmnopqrs"; StringBuilder stb = new StringBuilder(str); 整型数组转化为字符串 StringBuilder s = new StringBuilder(); for(i=1;i<=n;i++) { s.append(String.valueOf(a[i])); } String str = ""+s; 字符串转化为

  • java转换字符串编码格式的方法

    java转换字符串编码格式 (解码错误,重新解码) 字符集概念:规定了某个文字对应的二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)的转换关系. 我们在计算机屏幕上看到的是实体化的文字,而在计算机存储介质中存放的实际是二进制的比特流. 乱码场景(纯属瞎掰): 1) 前台输入utf-8编码的一串汉字(string1). (页面编码为utf-8, 在内存中会将这串汉字以utf-8编码为对应的二进制流存储) 2) 这串汉字(string1)的二进制流在经过http协议传输到后台时,这段

  • Java 数据类型及类型转换的互相转换实例代码

    一.基本数据类型 java的数据类型可以分为两大类:基本类型和复合类型. 基本类型:整型(int,short,long,byte).浮点型(float,double).布尔型(boolean).和字符型(char) 复合类型:数组,类,接口 1.整型 各种整型数据所占空间及数的范围 数据类型 所占内存空间/位 数的范围 byte 8 -128~127 short 16 -32768~32767 int 32 -2^31~2^31-1 long 64 -2^63~2^63-1 整型以补码的形式存放

  • 判断java文件类型TikaToolKit的实例

    引入依赖 <dependency> <groupId>org.apache.tika</groupId> <artifactId>tika-core</artifactId> <version>1.20</version> </dependency> 或 compile 'org.apache.tika:tika-core:1.20' 工具类 import lombok.AllArgsConstructor;

  • Java 文件上传的实例详解

    Java 文件上传的实例详解 java 文件上传 Java文件上传,介绍几种常用的方法,也是经过本人亲手调试过的 1.jspsmartupload 这个组件用起来是挺方便的,不过就是只适合小文件上传,如果大文件上传的话就不行,查看了一下他的代码,m_totalBytes = m_request.getContentLength(); m_binArray = new byte[m_totalBytes];居然把整个上传文件都读到内存去了,那如果是上传几十M的文件,同时几个用户上传,服务器稳挂,不

  • Java元组类型javatuples使用实例

    这篇文章主要介绍了Java元组类型javatuples使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 有时候经常需要返回2个值或多个值的一个序列,比如数据表的一条记录,文件的一行内容等.除了使用数组Array.集合(List.Set.Map)这些容器类型之外,在Java中我们就必须创建一个Class来作为返回类型.但很多时候我们只需要两三个字段,这个时候非要定义一个class就很烦琐了,所以这肯定不是一种最佳方式. 在很多语言中都提供元

  • 简单了解JAVA变量类型及代码实例

    这篇文章主要介绍了简单了解JAVA变量类型及代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在Java语言中,有类变量.实例变量.局部变量,所有的变量在使用前必须声明.声明普通变量如下: public int a,b,c; //整型变量 public float f = 3.14f: //单精度浮点型变量,并赋值 public double d; //双精度浮点型变量 public byte b =22: //整型变量 public S

  • Java文件操作工具类fileUtil实例【文件增删改,复制等】

    本文实例讲述了Java文件操作工具类fileUtil.分享给大家供大家参考,具体如下: package com.gcloud.common; import java.io.*; import java.net.MalformedURLException; import java.net.URL; /** * 文件工具类 * Created by charlin on 2017/9/8. */ public class FileUtil { /** * 读取文件内容 * * @param is *

  • js判断上传文件类型判断FileUpload文件类型代码

    asp.net中html标签代码: 复制代码 代码如下: <asp:FileUpload ID="fuMain" runat="server" /> <asp:Button ID="btnUpload" runat="server" OnClientClick="return CheckWorkFile()" Text="上传" /> 普通的html标签: 复制代

  • Java文件快速copy复制实例代码

    前言 最近学习netty的时候发现nio包下有个FileChannel类,经过了解这个类作用是个专门负责传输文件的通道,支持多线程,而且经过反复多次测试FileChannel复制文件的速度比BufferedInputStream/BufferedOutputStream复制文件的速度快了近三分之一.在复制大文件的时候更加体现出FileChannel的速度优势.而且FileChannel是多并发线程安全的.代码也比较简洁 代码贴下 package com.niu.nio; import java.

  • Java异常类型以及处理实例详解

    目录 一.异常的描述 二.异常的体系 三.异常的分类: 四.异常处理的捕捉形式 五.异常处理的原则 六.finally 七.异常的应用 八.异常的注意事项: 总结 一.异常的描述 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止.在Java中即,Java在编译或运行或者运行过程中出现的错误. Java提供了更加优秀的解决办法:异常处理机制. 异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处

  • JAVA Integer类型自加实例详解

    JAVA语言中有一些基本数据类型,比如int,long,double... 这些数据类型可以支持一些运算操作符,其中对于int类型的++/--操作符 Integer类型是一个对象类型,居然也可以支持++运算,那么问题来了 一个Integer对象执行++操作之后还是原来那个对象吗? 测试代码 public class IntegerTest { @Test public void test() { Integer a = 1; System.out.println(System.identityH

  • java文件操作代码片断实例实现统计文件中字母出现的个数功能

    复制代码 代码如下: String fileName = "D:/date.java.bak";        // String fileName = "D:/test.qqq";        String line;        int i = 0, j = 0, f = 0, k = 0;        try {            BufferedReader in = new BufferedReader(new FileReader(fileNa

随机推荐