`

java通过文件头来判断文件类型

    博客分类:
  • Java
阅读更多
package cn.com.songjy.test.io;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

public class FileTypeUtils {
	public final static Map<String, String> FILE_TYPE_MAP = new HashMap<String, String>();

	private FileTypeUtils() {
	}

	static {
		getAllFileType(); // 初始化文件类型信息
	}

	/**
	 * Created on 2013-1-21
	 * <p>
	 * Discription:[getAllFileType,常见文件头信息]
	 * 
	 * @author:shaochangfu
	 */
	private static void getAllFileType() {
		FILE_TYPE_MAP.put("jpg", "FFD8FF"); // JPEG (jpg)
		FILE_TYPE_MAP.put("png", "89504E47");// PNG (png)
		FILE_TYPE_MAP.put("gif", "47494638");// GIF (gif)
		FILE_TYPE_MAP.put("bmp", "424D"); // Windows Bitmap (bmp)
		FILE_TYPE_MAP.put("zip", "504B0304");// zip 压缩文件
	}

	public static void main(String[] args) throws Exception {
		File f = new File("/home/newpro/桌面/2013-1-17-2.png");
		File f2 = new File("/home/newpro/桌面/Screenshot.Png");
		File f3 = new File("/home/newpro/桌面/Screenshot.zip");
		File f4 = new File("/home/newpro/桌面/svn插件1.6.zip");

		// 判断是否是iamge,是image 并且后缀名 是 JPEG,PNG,GIF BMP
		System.out.println(isImage(f) + "is image");
		System.out.println(isImage(f2) + "is image");
		System.out.println(getImageFileType(f) + " is image");
		System.out.println(getImageFileType(f2) + " is image");

		// 判断是否是zip
		System.out.println(getFileByFile(f3) + " is zip");
		System.out.println(getFileByFile(f4) + " is zip");
	}

	/**
	 * Created on 2013-1-21
	 * <p>
	 * Discription:[getImageFileType,获取图片文件实际类型,若不是图片则返回null]
	 * </p>
	 * 
	 * @param File
	 * @return fileType
	 * @author:shaochangfu
	 */
	public final static String getImageFileType(File f) {
		if (isImage(f)) {
			try {
				ImageInputStream iis = ImageIO.createImageInputStream(f);
				Iterator<ImageReader> iter = ImageIO.getImageReaders(iis);
				if (!iter.hasNext()) {
					return null;
				}
				ImageReader reader = iter.next();
				iis.close();
				return reader.getFormatName();
			} catch (IOException e) {
				e.printStackTrace();
				return null;
			} catch (Exception e) {
				e.printStackTrace();
				return null;
			}
		}
		return null;
	}

	/**
	 * Created on 2013-1-21
	 * <p>
	 * Discription:[getFileByFile,获取文件类型,包括图片,若格式不是已配置的,则返回null]
	 * </p>
	 * 
	 * @param file
	 * @return fileType
	 * @author:shaochangfu
	 */
	public final static String getFileByFile(File file) {
		String filetype = null;
		byte[] b = new byte[50];
		try {
			InputStream is = new FileInputStream(file);
			is.read(b);
			filetype = getFileTypeByStream(b);
			is.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return filetype;
	}

	/**
	 * Created on 2013-1-21
	 * <p>
	 * Discription:[getFileTypeByStream]
	 * </p>
	 * 
	 * @param b
	 * @return fileType
	 * @author:shaochangfu
	 */
	public final static String getFileTypeByStream(byte[] b) {
		String filetypeHex = String.valueOf(getFileHexString(b));
		Iterator<Entry<String, String>> entryiterator = FILE_TYPE_MAP
				.entrySet().iterator();
		while (entryiterator.hasNext()) {
			Entry<String, String> entry = entryiterator.next();
			String fileTypeHexValue = entry.getValue();
			if (filetypeHex.toUpperCase().startsWith(fileTypeHexValue)) {
				return entry.getKey();
			}
		}
		return null;
	}

	/**
	 * Created on 2013-1-21
	 * <p>
	 * Discription:[isImage,判断文件是否为图片]
	 * </p>
	 * 
	 * @param file
	 * @return true 是 | false 否
	 * @author:shaochangfu
	 */
	public static final boolean isImage(File file) {
		boolean flag = false;
		try {
			BufferedImage bufreader = ImageIO.read(file);
			int width = bufreader.getWidth();
			int height = bufreader.getHeight();
			if (width == 0 || height == 0) {
				flag = false;
			} else {
				flag = true;
			}
		} catch (IOException e) {
			flag = false;
		} catch (Exception e) {
			flag = false;
		}
		return flag;
	}

	/**
	 * Created on 2013-1-21
	 * <p>
	 * Discription:[getFileHexString]
	 * </p>
	 * 
	 * @param b
	 * @return fileTypeHex
	 * @author:shaochangfu
	 */
	public final static String getFileHexString(byte[] b) {
		StringBuilder stringBuilder = new StringBuilder();
		if (b == null || b.length <= 0) {
			return null;
		}
		for (int i = 0; i < b.length; i++) {
			int v = b[i] & 0xFF;
			String hv = Integer.toHexString(v);
			if (hv.length() < 2) {
				stringBuilder.append(0);
			}
			stringBuilder.append(hv);
		}
		return stringBuilder.toString();
	}
}


引自:http://ashaochangfu.blog.163.com/blog/static/10425173020130229186219/

参阅:http://blog.csdn.net/songylwq/article/details/6139753
分享到:
评论

相关推荐

    java通过文件头内容判断文件类型

    java通过文件头内容判断文件类型

    java实现上传文件类型检测过程解析

    主要介绍了java实现上传文件类型检测过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Android中Java根据文件头获取文件类型的方法

    本文实例讲述了Android中Java根据文件头获取文件类型的方法。分享给大家供大家参考,具体如下: 前面讲过Android系统内部的MediaFile类来获取文件类型的办法,这个类主要是根据文件的扩展名来判断,其准确性不是很好...

    java获取文件编码(判断有无BOM)

    利用chardet,cpdetector包获取文件格式,并判断文件类型是否带BOM

    Java实现的获取和判断文件头信息工具类用法示例

    主要介绍了Java实现的获取和判断文件头信息工具类,结合实例形式分析了Java针对文件读取及头信息判断相关操作技巧,需要的朋友可以参考下

    文件类型判断java

    从服务器上下载文件,遇到文件后缀名和文件编码不匹配的状况,找了一些方法通过读取文件流的头二十个字节判断文件真实的类型

    SpringBoot文件上传控制及Java 获取和判断文件头信息

    主要介绍了SpringBoot文件上传控制的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

    Java判断上传图片格式的实例代码

    主要介绍了Java判断上传图片格式的实例代码,在文中给大家提到了Java使用文件头的类型判断上传的文件是否为图片类型,需要的朋友可以参考下

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java web 期末复习题库(便于打印)

    当访问一个 Servlet 时,...C 判断指定名字的 HTTP 文件头是否存在 D 向客户端发送错误信息 pageContext 对象的 findAttribute() 方法的作用是 A.用来设置默认页面的范围或指定范围之中的已命名对象 B.用来删除默

    Java网络编程-Socket-文件传输小案例

    //读取一个字节,获得文件头信息,判断发送信息类型(head or body) switch (cmd) { case 0x1: { ///文件信息 if (buflen &gt;= 260) { FileSize = buf.getInt(); //获取文件大小 byte[] filename = new byte[255]; ...

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java开源包4

    Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 16/32 格式文件系统的纯 Java 类库(纯的)。 Eclipse的HTML格式化插件 Eclipse Tidy Eclipse HTML Tidy 是一款 Eclipse 的...

    pcm,wav,amr三种格式8K和16K音频文件

    pcm,wav,amr三种格式,采样率8K和16K的音频文件。很适合用来做语音识别的测试音频文件。

    Java开发技术大全(500个源代码).

    HelloNative.java 准备调用C函数的java文件 HelloNative.lib 用VC编译生成的静态库文件 HelloNative.obj 用VB编译生成的目标文件 HelloNativeTest.java 测试本地化是否成功的类文件 instanceVar.java 定义一个...

    java实现office、wps转pdf,pdf转word

    支持word、excel、ppt、wps、txt等多种格式转pdf、并支持pdf转word。个人感觉非常好用。

    java多线程下载

    1.得到服务器下载文件的大小,然后在本地设置一个临时文件和服务器端文件大小一致 a)获得访问网络地址 b)通过URL对象的openConnection()方法打开连接,返回一个连接对象 c)设置请求头 i.setRequestMethod ii....

    深入理解Java虚拟机笔记(带目录).docx

    * 可达性分析法(Reachability Analysis):通过判断对象是否可以被 GC Roots 节点所达来判断对象是否死亡。 * finalize() 方法:通过对象的 finalize() 方法来判断对象是否死亡。 引用的 4 中情况 在 Java 中,...

    解析图片格式支持多大10种以上,亲测可用!

    1、解析图片的信息,支持图片的类型支持格式,如 jpg、 png、bmp、 cur、 dds、gif、 hdr (pic)、 ...2、本程序不是通过扩展名来识别图片格式,而是通过文件头和文件格式特征来判断图片格式。 3、兼容windows、Linux

Global site tag (gtag.js) - Google Analytics