在Java Server后台可能会遇到读取文本文件时的乱码问题,个人认为解决问题的最有效方法就是使用文件内容的字符编码来读取该文件。
问题又来了,文件是用户上传的,我们小程序员又没办法控制,让用户只能上传UTF-8文件,或者只能上传GBK文件,那只能程序员在代码中对文件进行检测,看用户究竟传的是那种编码格式。
而jchardet是firefox使用的字节流编码检测算法的java开源实现,协议为MPL(Mozilla Public License),对商业友好。可以考虑用它来检测文件的编码。相关资料链接 http://www.mozilla.org/projects/intl/chardet.html http://jchardet.sourceforge.net/
用jchardet的API依葫芦画瓢写上一个小Demo:
import java.io.BufferedInputStream;
import java.io.IOException;
import org.apache.commons.fileupload.FileItem;
import org.mozilla.intl.chardet.nsDetector;
import org.mozilla.intl.chardet.nsICharsetDetectionObserver;
public class FileCharsetDetector
{
private boolean found = false;
private String encoding = null;
public String guestFileEncoding(FileItem fileItem) throws IOException
{
return guestFileEncoding(fileItem, new nsDetector());
}
private String guestFileEncoding(FileItem fileItem, nsDetector det) throws IOException
{
// Set an observer...
// The Notify() will be called when a matching charset is found.
det.Init(new nsICharsetDetectionObserver()
{
public void Notify(String charset)
{
found = true;
encoding = charset;
}
});
BufferedInputStream imp = new BufferedInputStream(fileItem.getInputStream());
byte[] buf = new byte[1024];
int len;
boolean done = false;
boolean isAscii = true;
while ((len = imp.read(buf, 0, buf.length)) != -1)
{
// Check if the stream is only ascii.
if (isAscii)
{
isAscii = det.isAscii(buf, len);
}
// DoIt if non-ascii and not done yet.
if (!isAscii && !done)
{
done = det.DoIt(buf, len, false);
}
}
det.DataEnd();
if (isAscii)
{
encoding = "ASCII";
found = true;
}
if (!found)
{
String prob[] = det.getProbableCharsets();
if (prob.length > 0)
{
encoding = prob[0];
} else
{
return null;
}
}
return encoding;
}
}
相关推荐
NULL 博文链接:https://thinktothings.iteye.com/blog/1536044
java 解析csv文件例子,csv文件 中文乱码问题
Java读取TXT文本文件乱码解决方案.doc
本工程用于研究如何使用Java代码获取文件、文件流或字符串的编码方式 本工程编码方式:UTF-8 开发工具:MyEclipse 参考博客:http://blog.csdn.net/gaohuanjie/article/details/43735891
读取与创建CSV文件,根据第三方jar包自动解析文件编码方式,相关jar包与使用说明
在文件上载和表单提交的过程中,有两个指的关心的问题,一是上载的数据是是采用的那种方式的编码,这个问题的可以从 Content-Type 中得到答案,另一个是问题是上载的数据量有多少即 Content-Length ,知道了它,就...
件上传和下载是web开发中常遇到的问题。今天小编给大家分享下Java Web实现文件下载和乱码处理方法的相关资料,需要的朋友可以参考下
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
读取PDF文件中的信息 package com.zht; import java.io.File; import java.io.UnsupportedEncodingException; import java.sql.Connection; import java.sql.DriverManager; import java.sql....
主要介绍了Java(springboot) 读取txt文本内容代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
Java 获取视频时长、格式、大小需要的jar jave-1.0.2
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...
* 上传文件 * @param localFile 本地目录地址 * @param remoteTargetDirectory 远程目录地址 */ public void putFile(String localFile, String remoteTargetDirectory) { try { if(login()){ ...
1、本项目为读取E盘根目录下名为new_datad.txt的json数组文件存入数据库 2、大环境 windows操作系统 jdk:1.7.0_21 tomcat7.0 eclipse Mars.2 Release (4.5.2) 数据库:mysql 5.7.12 数据库名 wordpress 编码...
Java从网络取得文件 1个目标文件 简单 Java从压缩包中提取文件 1个目标文件 简单 Java存储与读取对象 1个目标文件 如题 Java调色板面板源代码 1个目标文件 摘要:Java源码,窗体界面,调色板 使用Java语言编写的一款...
内容: 1 转换基本数据类型;运算符;计算阶乘; 2 复数类;java的参数传递;自定义形状类;类的加载顺序;方法和变量在继承时的覆盖和隐藏;... 上传文件; 用servlet生成图形验证码; 用servlet实现分页查看数据库;