• JAVA读取文件字符集【File、MultipartFile、cpdetector】


    一、简介

    cpdetector:是一款基于JAVA的文件编码方式检测工具

    二、导入cpdetector的jar包

    下载地址:https://mvnrepository.com

    <dependency>
    <groupId>net.sourceforge.cpdetector</groupId>
    <artifactId>cpdetector</artifactId>
    <version>1.0.7</version>
    </dependency>
    <dependency>
    <groupId>org.mozilla.intl</groupId>
    <artifactId>chardet</artifactId>
    <version>1.0</version>
    </dependency>
    <dependency>
    <groupId>antlr</groupId>
    <artifactId>antlr</artifactId>
    <version>2.7.4</version>
    </dependency>

    三、两种传参方式实现读取文件编码集

    1、传入url解析文件编码

    package com.example.demo;
    
    import info.monitorenter.cpdetector.io.*;
    import info.monitorenter.cpdetector.io.ParsingDetector;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.io.File;
    
    public class EncodeTest {
    
        public static void main(String[] args) {
            String charsetName = getFileEncode("E:\test1.sql");
            System.out.println(charsetName);
        }
        /**
         * 利用第三方开源包cpdetector获取文件编码格式
         * @param path:要判断文件编码格式的源文件的路径
         */
        public static String getFileEncode(String path) {
            /*
             * detector是探测器,它把探测任务交给具体的探测实现类的实例完成。
             * cpDetector内置了一些常用的探测实现类,这些探测实现类的实例可以通过add方法 加进来,如ParsingDetector、
             * JChardetFacade、ASCIIDetector、UnicodeDetector。
             * detector按照“谁最先返回非空的探测结果,就以该结果为准”的原则返回探测到的
             * 字符集编码。使用需要用到三个第三方JAR包:antlr.jar、chardet.jar和cpdetector.jar
             * cpDetector是基于统计学原理的,不保证完全正确。
             */
            CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
            /*
             * ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于
             * 指示是否显示探测过程的详细信息,为false不显示。
             */
            detector.add(new ParsingDetector(false));
            /*
             * JChardetFacade封装了由Mozilla组织提供的JChardet,它可以完成大多数文件的编码
             * 测定。所以,一般有了这个探测器就可满足大多数项目的要求,如果你还不放心,可以
             * 再多加几个探测器,比如下面的ASCIIDetector、UnicodeDetector等。
             */
            detector.add(JChardetFacade.getInstance());// 用到antlr.jar、chardet.jar
            // ASCIIDetector用于ASCII编码测定
            detector.add(ASCIIDetector.getInstance());
            // UnicodeDetector用于Unicode家族编码的测定
            detector.add(UnicodeDetector.getInstance());
            java.nio.charset.Charset charset = null;
            File f = new File(path);
            try {
                charset = detector.detectCodepage(f.toURI().toURL());
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            if (charset != null)
                return charset.name();
            else
                return null;
        }
    }
    

    2、传入文件流解析文件编码集

    package com.example.demo.controller;
    
    import info.monitorenter.cpdetector.io.*;
    import info.monitorenter.util.FileUtil;
    import org.mozilla.universalchardet.UniversalDetector;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.io.*;
    import java.nio.charset.Charset;
    import java.util.Iterator;
    import java.util.LinkedHashSet;
    import java.util.Set;
    
    @RequestMapping("/test")
    @RestController
    public class DemoTestController {
    
        private Set<ICodepageDetector> detectors = new LinkedHashSet();
    
        @RequestMapping("test")
        public String test(MultipartFile file) throws IOException {
            return getFileEncode(file);
        }
    
        /**
         * 利用第三方开源包cpdetector获取文件编码格式
         */
        public String getFileEncode(MultipartFile file) {
            /*
             * detector是探测器,它把探测任务交给具体的探测实现类的实例完成。
             * cpDetector内置了一些常用的探测实现类,这些探测实现类的实例可以通过add方法 加进来,如ParsingDetector、
             * JChardetFacade、ASCIIDetector、UnicodeDetector。
             * detector按照“谁最先返回非空的探测结果,就以该结果为准”的原则返回探测到的
             * 字符集编码。使用需要用到三个第三方JAR包:antlr.jar、chardet.jar和cpdetector.jar
             * cpDetector是基于统计学原理的,不保证完全正确。
             */
            CodepageDetectorProxy detector = CodepageDetectorProxy.getInstance();
            /*
             * ParsingDetector可用于检查HTML、XML等文件或字符流的编码,构造方法中的参数用于
             * 指示是否显示探测过程的详细信息,为false不显示。
             */
            detector.add(new ParsingDetector(false));
            /*
             * JChardetFacade封装了由Mozilla组织提供的JChardet,它可以完成大多数文件的编码
             * 测定。所以,一般有了这个探测器就可满足大多数项目的要求,如果你还不放心,可以
             * 再多加几个探测器,比如下面的ASCIIDetector、UnicodeDetector等。
             */
            detector.add(JChardetFacade.getInstance());// 用到antlr.jar、chardet.jar
            // ASCIIDetector用于ASCII编码测定
            detector.add(ASCIIDetector.getInstance());
            // UnicodeDetector用于Unicode家族编码的测定
            detector.add(UnicodeDetector.getInstance());
            java.nio.charset.Charset charset = null;
    //        File f = new File(path);
            try {
                BufferedInputStream in = new BufferedInputStream(file.getInputStream());
    //            charset = detector.detectCodepage(f.toURI().toURL());
                charset = detector.detectCodepage(in,2147483647);
    //            charset = codeTest(in,2147483647);
                System.out.println(charset);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            if (charset != null)
                return charset.name();
            else
                return null;
        }
    }
    

     四、测试结果

  • 相关阅读:
    Nginx-limit_req限速配置示例
    Linux-配置虚拟IP实例
    jQuery中获取a标签的值
    js时间格式化
    a标签与js的冲突
    spring MVC页面的重定向
    EL表达式遍历集合获取下标
    商城项目之实战-购物车模块
    js中得计算问题算式结果拼接成字符串怎么解决
    js中数值类型相加变成拼接字符串的问题
  • 原文地址:https://www.cnblogs.com/wangdahui/p/13540626.html
Copyright © 2020-2023  润新知