`

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中通过文件头内容来判断文件类型。 首先,了解文件头的基本概念。文件头是指文件开始的一段字节,不同的文件格式会有不同的文件头结构。例如,JPEG图像文件的开头通常是"FF D8 FF E0...

    根据头信息判断文件类型

    根据头信息判断文件类型是计算机科学中的一个常见技术,它基于这样一个事实:大多数文件格式在开始部分都会包含一些特定的字节序列,这些序列被称为“魔术数字”或“文件签名”,用于标识文件的类型。这种方法在很多...

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

    然后,使用 HashMap 缓存文件头信息,通过文件头信息来判断文件的真正类型。 以下是 Java 实现上传文件类型检测过程解析的示例代码: ```java import java.io.*; import java.util.HashMap; public class ...

    根据文件头信息判断文件类型

    综上所述,理解并利用文件头信息来判断文件类型是IT从业者必备的技能之一。无论是编写脚本处理大量文件,还是排查数据传输问题,这个知识都能提供强大的支持。通过深入学习和实践,我们可以更高效地管理和操作各种...

    VC通过文件头格式,判断文件的真实格式

    以下是一个Java语言的示例代码,展示了如何通过文件头判断文件类型: ```java import java.io.FileInputStream; import java.io.IOException; public class FileHeaderCheck { /** * byte数组转换成16进制字符串...

    Java判断文件编码格式 - 明明是悟空 - 博客园1

    总的来说,Java中判断文件编码格式的方法包括简单的字节匹配和使用更复杂的库如cpdetector。在实际开发中,应根据项目的具体需求选择合适的方法,确保能正确处理各种编码格式的文件,避免因为编码问题导致的乱码现象...

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

    本文将详细介绍如何在Java中获取文件的编码并判断文件是否带有BOM。 首先,让我们了解一下什么是BOM。BOM是UTF-8、UTF-16和UTF-32等编码格式中的一个可选标记,用于告知解析器文件的编码类型。例如,UTF-8的BOM是三...

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

    Java实现的获取和判断文件头信息工具类用法示例 ...Java实现的获取和判断文件头信息工具类可以根据文件路径获取文件头信息,并根据头信息来判断文件类型,该工具类可以应用于各种文件管理和识别系统中。

    java如何实现判断文件的真实类型

    Java如何实现判断文件的真实...判断文件真实类型是非常重要的,Java可以通过文件头信息来判断文件的真实类型。通过缓存文件头信息,可以快速地判断文件的真实类型。这个技术可以广泛应用于文件上传、下载、传输等方面。

    java程序判断文件编码的类型

    本文档旨在教导读者如何通过Java编程语言来判断文件的编码类型。这包括常见的编码格式如GBK、UTF-8等。了解文件编码对于处理多语言环境下的文本数据至关重要。 #### 详细知识点解析 ##### 文件编码类型简介 文件...

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

    2. Java 获取和判断文件头信息:如何使用 Java 语言来获取和判断文件头信息,包括如何使用 MultipartFile 对象来获取文件信息,以及如何判断文件的类型和大小等信息。 3. Ajax 文件上传:如何使用 Ajax 方式上传文件...

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

    为了提高识别的准确性,我们可以依据文件头信息来判断文件类型。文件头通常包含特定的字节序列,这些序列是文件格式的标识符。 本文将详细介绍一种在Android中使用Java根据文件头获取文件类型的实现方法。这个方法...

    文件类型判断java

    本篇文章将深入探讨如何在Java中通过读取文件流的头二十个字节来判断文件类型。 首先,我们要理解为什么需要通过文件流的字节来判断类型。文件的后缀名仅仅是人为设定的标识,有时可能被篡改或丢失,而文件的实际...

    java下载文件各类型类

    例如,你可以创建一个 `URL` 对象来指定要下载的文件地址,然后通过 `openConnection()` 方法获取 `URLConnection` 实例,设置请求头信息如 `User-Agent`,并开启连接。 其次,Java IO 流是处理数据传输的核心工具...

    TrIDNet判断文件类型

    在提供的压缩包文件中,“如何判断文件类型.pdf”和“Java判断文件类型.pdf”很可能是关于这两个主题的详细教程,可以帮助用户深入了解如何进行文件类型的识别。而“triddefs_xml.rar”可能包含TrIDNet的识别规则库...

    JAVA实现文件类型预处理

    文件类型可以通过文件扩展名来识别,但这种方法并不完全可靠,因为用户可以随意更改扩展名。更准确的方法是使用FileInputStream读取文件的头部几个字节,根据这些字节的二进制模式来识别文件类型,例如图片、音频、...

    java 解析csv文件例子,csv文件 中文乱码问题

    这段代码利用Apache Commons CSV库解析文件,同时支持了文件头作为字段名。 总结来说,处理包含中文字符的CSV文件,关键在于正确设置文件的编码,选择合适的读取方式,并确保与文件的实际编码匹配。此外,合理利用...

    java识别文件编码格式

    一种常见的方法是逐行读取文件,尝试用多种常见编码进行解码,根据解码是否成功或解码后的字符集来判断文件的编码。 6. **错误计数法**:如果在读取文件时遇到乱码,可以通过记录错误字符的数量和类型来推测文件的...

    java 解析 tar gz文件 两种方法

    在Java中解析这种类型的文件,通常需要两个步骤:首先解压gzip,然后解包tar。这里我们将详细探讨两种不同的方法来实现这个过程。 方法一:使用Apache Commons Compress库 Apache Commons Compress库是Java社区...

    Java实现文件下载功能

    2. **HTTP响应头**:在HTTP协议中,服务器通过响应头向客户端传递额外的信息,如文件名、文件大小和MIME类型等。其中,“Content-Disposition”用于指定文件的下载方式,通常设置为“attachment”表示附件下载。 3....

Global site tag (gtag.js) - Google Analytics