通过读取文件头部判断是否为CSV格式文件

本文介绍如何通过读取文件头部来正确判断一个文件是否为CSV格式,而非仅依赖文件后缀。这种方法能防止因文件后缀篡改导致的误解析,并有助于提升服务器安全性。

通过读取文件头部判断是否为CSV格式文件

            通过读取CSV文件头,判断文件是是否属于CSV文件类型,一般而言仅仅只是通过文件后缀来判断该文件所属的类型,这样是不合理的,只要更改一下文件后缀就无法识别这个文件到底是不是正确的文件格式,把可执行的文件后缀改为.CSV如果是通过判断文件后缀来识别文件类型,这样肯定是行不通的,因为exe的文件格式肯定不是CSV的格式,如果提前判断出这个文件头的这样就能定位这个文件是不是我们所需要的文件类型,避免对错误的文件进行解析。同样也可以在某种程度上保护服务器的安全。

/*
 * System Abbrev :
 * system Name  :
 * Component No  :
 * Component Name:
 * File name     :Util.java
 * Author        :Qiuzhenping
 * Date          :2014-11-30
 * Description   :  <description>
 */

/* Updation record 1:
 * Updation date        :  2014-11-30
 * Updator          :  Qiuzhenping
 * Trace No:  <Trace No>
 * Updation No:  <Updation No>
 * Updation Content:  <List all contents of updation and all methods updated.>
 */
package com.qiuzhping.util;

import java.io.FileInputStream;

/**
 * <Description functions in a word> 
 * 通过读取CSV文件头,判断文件是是否属于CSV文件类型,一般而言仅仅只是通过文件后缀来判断该文件所属的类型,
 * 这样是不合理的,只要更改一下文件后缀就无法识别这个文件到底是不是正确的文件格式,把可执行的文件后缀改为.CSV
 * 如果是通过判断文件后缀来识别文件类型,这样肯定是行不通的,因为exe的文件格式肯定不是CSV的格式,如果提前判断
 * 出这个文件头的这样就能定位这个文件是不是我们所需要的文件类型,避免对错误的文件进行解析。同样也可以在某种程度上
 * 保护服务器的安全。
 * <Detail description>
 * 
 * @author Qiuzhenping
 * @version [Version NO, 2014-11-30]
 * @see [Related classes/methods]
 * @since [product/module version]
 */
public class Util {

	/** <Description functions in a word>
	 * Bytes to Hex String
	 * 将字节数组转换成16进制字符串
	 * <Detail description>
	 * @author  Qiuzhenping
	 * @param src
	 * @return [Parameters description]
	 * @return String [Return type description]
	 * @exception throws [Exception] [Exception description]
	 * @see [Related classes#Related methods#Related properties]
	 */
	public static String bytes2HexString(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);
		}
		System.out.println(" bytes2HexString = "+stringBuilder.toString().toUpperCase());
		return stringBuilder.toString().toUpperCase();
	}

	/** <Description functions in a word>
	 * Judge this FileInputStream is csv file
	 * 判断该文件流头部是否包含有指定的信息,从而确认该文件是不是正确的文件类型
	 * <Detail description>
	 * @author  Qiuzhenping
	 * @param is
	 * @return [Parameters description]
	 * @return boolean [Return type description]
	 * @exception throws [Exception] [Exception description]
	 * @see [Related classes#Related methods#Related properties]
	 */
	public static boolean judgeIsCSV(FileInputStream is){
		try {
			byte[] b = new byte[4];
			is.read(b, 0, b.length);
			return bytes2HexString(b).contains("5B75726C");//CSV文件的头部的前4个字节
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}

	public static void main(String[] args) throws Exception {
		String src = "C:/dataTemp/Url使用.csv";
		FileInputStream is = new FileInputStream(src);
		System.out.println(judgeIsCSV(is));
		src = "C:/dataTemp/Url使用.csv";
		is = new FileInputStream(src);
		System.out.println(judgeIsCSV(is));
	}
}
转载请注明:http://blog.csdn.net/qiuzhping/article/details/41626295

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值