java 判断文件编码格式(支持zip)

前言:

    最近在工作过程中遇到了这样的问题: 通过文件上传,需要导入zip包中的文件信息。
由于使用的是apache的ant.jar中的ZipFile类、ZipEntry类。由于目前该工具类并不能判断zip中每个文件的具体的编码,
导致解析时出现中文乱码。通过查找资料发现借鉴使用第三方工具cpDetector解决。因此在此做个记录。若想实现更复杂的文件编码检测,可以使用一个开源项目cpdetector,网址: http://cpdetector.sourceforge.net
它的类库很小,只有500K左右,cpDetector是基于统计学原理的,不保证完全正确,利用该类库判定文本文件的代码如下:

准备条件

- 需要的jar包:cpdetector_1.0.10.jar、antlr-2.7.4.jar、chardet-1.0.jar、jargs-1.0.jar
- 源码:cpdetector_1.0.10_binary.zip
- 相关资料:https://www.cnblogs.com/king1302217/p/4003060.html

具体实现

    在此摸索过程中遇到的问题:  查找了网上的参考例子,但是几乎所有的都是直接处理针对File对象的处理。
没有针对zip文件的相关处理逻辑。并且由于apache的ZipFile 、 以及它内部的文件对象ZipEntry不能使用url方式。
于是查看底层实现代码发现可以用此: **charset = detector.detectCodepage(bis, Integer.MAX_VALUE);// zip 判断的关键代码**

注意:直接使用zipFile.getInputStream(zipEntry) 得到的inputStream流不支持mark()方法。但是cpdetector底层需要用此方法.后来查找发现底层其实有类似场景的特殊处理:若是不支持mark()则可以把inputStream包装成支持的BufferedInputStream即可。如下:

具体代码如下:


import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.charset.Charset;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import info.monitorenter.cpdetector.io.ASCIIDetector;
import info.monitorenter.cpdetector.io.CodepageDetectorProxy;
import info.monitorenter.cpdetector.io.JChardetFacade;
import info.monitorenter.cpdetector.io.ParsingDetector;
import info.monitorenter.cpdetector.io.UnicodeDetector;
/*** 1、cpDetector内置了一些常用的探测实现类,这些探测实现类的实例可以通过add方法加进来,*    ParsingDetector、 JChardetFacade、ASCIIDetector、UnicodeDetector. * 2、detector按照“谁最先返回非空的探测结果,就以该结果为准”的原则. * 3、cpDetector是基于统计学原理的,不保证完全正确.*/
public class FileCharsetDetector {private static final Logger logger = LoggerFactory.getLogger(FileCharsetDetector.class);/*** 利用第三方开源包cpdetector获取文件编码格式.* * @param is*            InputStream 输入流* @return*/public static String getFileEncode(InputStream is) {//    begin     此段为zip格式文件的处理关键BufferedInputStream bis = null;if (is instanceof BufferedInputStream) {bis = (BufferedInputStream) is;} else {bis = new BufferedInputStream(is);}//   endCodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();detector.add(new ParsingDetector(false));detector.add(UnicodeDetector.getInstance());detector.add(JChardetFacade.getInstance());// 内部引用了 chardet.jar的类detector.add(ASCIIDetector.getInstance());Charset charset = null;try {charset = detector.detectCodepage(bis, Integer.MAX_VALUE);// zip 判断的关键代码} catch (Exception e) {logger.error(e.getMessage(), e);} finally {if (bis != null) {try {bis.close();} catch (IOException e) {logger.error(e.getMessage(), e);}}}// 默认为GBKString charsetName = "GBK";if (charset != null) {if (charset.name().equals("US-ASCII")) {charsetName = "ISO_8859_1";} else {charsetName = charset.name();}}return charsetName;}public static String getFileEncode(File  file) {CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();detector.add(new ParsingDetector(false));detector.add(UnicodeDetector.getInstance());detector.add(JChardetFacade.getInstance());detector.add(ASCIIDetector.getInstance());Charset charset = null;try {charset = detector.detectCodepage(file.toURI().toURL());} catch (Exception e) {logger.error(e.getMessage(), e);} // 默认为GBKString charsetName = "GBK";if (charset != null) {if (charset.name().equals("US-ASCII")) {charsetName = "ISO_8859_1";} else {charsetName = charset.name();}}return charsetName;}}

java 判断文件编码格式(支持zip)相关推荐

  1. java 判断是否为cst格式_Java判断文件编码格式

    1:简单判断是UTF-8或不是UTF-8,因为一般除了UTF-8之外就是GBK,所以就设置默认为GBK. 按照给定的字符集存储文件时,在文件的最开头的三个字节中就有可能存储着编码信息,所以,基本的原理 ...

  2. java 判断文件的类型,用java流方式判断文件类型

    这个方法只能在有限的范围内有效.并不是万金油 比如 图片类型判断,音频文件格式判断,视频文件格式判断等这种肯定是2进制且专业性很强的文件类型判断. 下面给出完整版代码 首先是文件类型枚取 packag ...

  3. Java判断文件夹是否存在,不存在则新建

    1.Java判断是否存在文件夹,不存在则新建 File file = new File("D:/test/filetest/test.txt"); if (!file.getPar ...

  4. java判断文件夹中的图片是否重复

    java判断文件夹中的图片是否重复 直接上代码 package com.example.common; import java.io.File; import java.io.FileInputStr ...

  5. java判断文件夹下是否存在文件_java 判断文件夹是否存在文件

    java 判断文件夹是否存在文件 1.首先使用File类创建一个File对象: 2.然后判断是否是目录,不是目录就返回 3.之后使用file.list()方法获取目录下文件并存入数组 4.最后判断数组 ...

  6. java判断文件编码是UTF-8还是UTF-8(BOM)还是其他编码

    java判断文件编码是UTF-8还是UTF-8(BOM)还是其他编码 final String filePath = "C:\\Users\\小太阳\\Desktop\\java\\2021 ...

  7. java判断文件是否图片_java怎么判断文件是否是图片

    java判断文件是否是图片的方法: 1.通过判断文件后缀名String extension = ""; int i = fileName.lastIndexOf('.'); if ...

  8. java解析压缩文件,支持zip,rar,7z压缩格式

    最近项目有需求对压缩文件进行解析,需要支持市面上比较流行的压缩格式,诸如zip,rar,7z: 由于压缩文件解析比较常见,特将代码整理出来,供后续参考学习: 以下是java代码: maven依赖: & ...

  9. Java判断文件类型

    通常,在WEB系统中,上传文件时都需要做文件的类型校验,大致有如下几种方法: 1. 通过后缀名,如exe,jpg,bmp,rar,zip等等. 2. 通过读取文件,获取文件的Content-type来 ...

  10. java 判断文件类型是否是音频_用java流方式判断文件类型

    这个方法只能在有限的范围内有效.并不是万金油 比如 图片类型判断,音频文件格式判断,视频文件格式判断等这种肯定是2进制且专业性很强的文件类型判断. 下面给出完整版代码 首先是文件类型枚取 packag ...

最新文章

  1. 痛入爽出 HTTP/2:代码实战1
  2. 直系同源基因ks_哈佛医学院开发出新的Cas9变体,可以靶向基因组绝大部分序列...
  3. nova 之compute服务
  4. 如何到SAP官网上查询某产品的roadmap - 路线图
  5. Java中MySQL事务处理举例
  6. java垃圾回收机制_干货:Java 垃圾回收机制
  7. 【转】1.3异步编程:线程同步基元对象
  8. STL源码剖析 数值算法 copy 算法
  9. Extra }, or forgotten endgroup. [ maketitlepage]问题的解决(uline命令)
  10. 兼容浏览器的布局CSS
  11. Python一些很实用的知识
  12. Nancy基于JwtBearer认证的使用与实现
  13. 7月最强书单丨博文视点新品畅销TOP10,让技术带你燃爆整个7月
  14. 给编程生涯充电的 10 本书
  15. Maven--Cargo远程部署
  16. 汇编语言指令用法大全
  17. 讯飞tts语音引擎_讯飞iFLYOS语音让家居产品更智能
  18. 拯救报错:Error: connect ETIMEDOUT
  19. mysql stmt
  20. 老外网络语言缩写总结

热门文章

  1. eclipse插件开发:把自定义的文件类型使用xml编辑器打开
  2. MATLAB生成M序列和Gold序列
  3. 仿城通网盘仿蓝奏网盘源码
  4. 爱折腾星人必备工具,系统重启还原精灵-影子卫士
  5. matlab gui的callback,matlab GUI callback 函数实现
  6. Python-振动信号加入噪声-代码实现
  7. 经纬度十进制与度分秒换算及数据库实现
  8. zigbee网关数据到json格式
  9. [电路笔记]三相电路
  10. 【人月神话】浅谈人月神话0.2什么是“人月”,为什么是“神话”?