需求:
某文件或者某字节流要检测他的编码格式。
实现:
基于jchardet
<dependency> <groupId>net.sourceforge.jchardet</groupId> <artifactId>jchardet</artifactId> <version>1.0</version> </dependency>
代码如下:
public class DetectorUtils { private DetectorUtils() { } static class ChineseCharsetDetectionObserver implements nsICharsetDetectionObserver { private boolean found = false; private String result; public void Notify(String charset) { found = true; result = charset; } public ChineseCharsetDetectionObserver(boolean found, String result) { super(); this.found = found; this.result = result; } public boolean isFound() { return found; } public String getResult() { return result; } } public static String[] detectChineseCharset(InputStream in) throws Exception { String[] prob=null; BufferedInputStream imp = null; try { boolean found = false; String result = Charsets.UTF_8.toString(); int lang = nsPSMDetector.CHINESE; nsDetector det = new nsDetector(lang); ChineseCharsetDetectionObserver detectionObserver = new ChineseCharsetDetectionObserver( found, result); det.Init(detectionObserver); imp = new BufferedInputStream(in); byte[] buf = new byte[1024]; int len; boolean isAscii = true; while ((len = imp.read(buf, 0, buf.length)) != -1) { if (isAscii) isAscii = det.isAscii(buf, len); if (!isAscii) { if (det.DoIt(buf, len, false)) break; } } det.DataEnd(); boolean isFound = detectionObserver.isFound(); if (isAscii) { isFound = true; prob = new String[] { "ASCII" }; } else if (isFound) { prob = new String[] { detectionObserver.getResult() }; } else { prob = det.getProbableCharsets(); } return prob; } finally { IOUtils.closeQuietly(imp); IOUtils.closeQuietly(in); } } }
测试:
String file = "C:/3737001.xml"; String[] probableSet = DetectorUtils.detectChineseCharset(new FileInputStream(file)); for (String charset : probableSet) { System.out.println(charset); }
依赖的jar参见附件
相关推荐
在处理字节流编码时,我们通常会遇到诸如字符集、字节顺序标记(BOM)、解码与编码的过程等概念。下面我们将深入探讨这些知识点。 首先,让我们了解什么是字节流。字节流是计算机处理数据的一种方式,无论是文件...
在Java编程语言中,字节流(Byte Stream)是处理数据的基本方式,特别是在进行I/O操作时。字节流主要用于处理二进制数据,如图片、音频、视频等非文本文件,同时也适用于处理文本文件。本篇文章将深入探讨Java中字...
NULL 博文链接:https://zhifeiji512.iteye.com/blog/1221068
### Java字符流和字节流详解 #### 一、引言 在Java中,I/O流主要用于处理输入输出操作,包括文件读写等。根据处理数据类型的不同,Java I/O流主要分为字节流和字符流两大类。字节流处理的是8位的字节数据,而字符流...
在Java编程语言中,输入/输出(I/O)操作是处理数据流的关键部分,而字符流与字节流则是实现这些操作的两种基本方式。理解它们的区别和应用场景对于任何Java开发者来说都是至关重要的。 ### 字节流 字节流是最基本...
在Java编程中,字节流(Byte Stream)是处理数据的一种基本方式,它适用于任何类型的数据,包括文本、图片、音频等。字节流主要分为输入流和输出流,其中InputStream类是所有字节输入流的基类,而OutputStream类则是...
Java 字节流与字符流的介绍 Java 中的流操作可以分为两种:字节流和字符流。字节流是指以 byte 为单位进行读写操作的流,而字符流是指以 char 为单位进行读写操作的流。 字节流的介绍 字节流的所有读操作都继承自...
Java的IO流是按照数据的流向分为输入流和输出流,按照数据类型分为字节流和字符流。字节流处理的是二进制数据,适用于任何类型的文件,包括文本文件和非文本文件(如图片、音频、视频等)。字符流则用于处理字符数据...
NULL 博文链接:https://nopainnogain.iteye.com/blog/771041
在Java编程语言中,字节流(Byte Stream)和字符流(Character Stream)是处理输入输出数据的两种基本方式。字节流主要用于处理任何类型的二进制数据,如图片、音频、视频等,而字符流则专为处理基于Unicode编码的...
在Java等编程语言中,通常使用特定的方法来检测字节流的编码,以便正确地转换为字符串。 这篇博客文章(https://joeyao.iteye.com/blog/482529)可能提供了这样的实现,即`BytesEncodingDetect.java`源代码文件。它...
在Java编程语言中,字节流(Byte Stream)和字符流(Character Stream)是处理输入输出数据的两种基本方式。它们构成了Java I/O系统的核心,用于读写文件、网络通信等场景。字节流和字符流的区别在于处理数据的基本...
本文将深入探讨如何读取和创建CSV文件,并特别关注自动解析文件编码方式这一关键环节。我们将使用Java语言进行示例,同时引入第三方库来辅助处理编码问题。 首先,创建CSV文件的基本过程涉及将数据写入具有特定分隔...
在处理文本数据时,如果使用字节流,需要考虑到字符编码问题,因为字节流不关心字符编码,而字符流默认使用平台的默认字符集。 实验中,练习六要求使用字节流复制文件,这通常涉及到读取源文件的字节数据,然后将其...
Java Socket字节流传输是Java网络编程中常用的一种通信方式,它允许两个应用程序通过网络进行数据交换。在Java中,Socket提供了基于TCP/IP协议的低级别通信接口,而字节流则是处理数据的基本单位,适合处理任何类型...
除此之外,InputStreamReader和OutputStreamWriter是字节流与字符流之间的桥梁,它们允许我们在字节流和字符流之间转换,以适应不同编码格式的需求。 在Java IO中,还有一套转换流(Wrapper Stream),即...
哈弗曼字节流编码译码器是一种基于哈弗曼编码的高效数据压缩工具,尤其适用于处理文本或二进制文件。哈弗曼编码是一种基于频率的变长编码方法,由克劳德·艾尔伍德·哈弗曼在1952年提出。它的核心思想是将出现频率高...
UTF-8则是一种通用的多字节编码方式,可以表示Unicode字符集中的所有字符,包括了GBK中的所有字符以及更多的非中文字符。 下面我们将详细探讨如何使用Java来处理这些编码: 1. **文件编码检测**:Java标准库中并...
根据处理的数据单位,Java提供了两种主要类型的流:字符流和字节流。这两种流在处理数据时有显著的区别,尤其是在处理文本数据和二进制数据时。 1. 什么是流 流在Java中是一个抽象概念,它描述了数据如何从一个地方...