`
songdingsong
  • 浏览: 25797 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java 读取上传文件的编码问题

    博客分类:
  • J2EE
 
阅读更多

在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;
	}

}

 

分享到:
评论
1 楼 lishengwu_java 2012-01-13  
好东西,刚好解决了我的那个问题....

相关推荐

    java读写csv文件,中文乱码问题

    NULL 博文链接:https://thinktothings.iteye.com/blog/1536044

    java 解析csv文件例子,csv文件 中文乱码问题

    java 解析csv文件例子,csv文件 中文乱码问题

    Java读取TXT文本文件乱码解决方案.doc

    Java读取TXT文本文件乱码解决方案.doc

    如何使用Java代码获取文件、文件流或字符串的编码方式.zip

    本工程用于研究如何使用Java代码获取文件、文件流或字符串的编码方式 本工程编码方式:UTF-8 开发工具:MyEclipse 参考博客:http://blog.csdn.net/gaohuanjie/article/details/43735891

    读取创建CSV文件并自动解析文件编码方式

    读取与创建CSV文件,根据第三方jar包自动解析文件编码方式,相关jar包与使用说明

    java 编写文件上传类简单易用

    在文件上载和表单提交的过程中,有两个指的关心的问题,一是上载的数据是是采用的那种方式的编码,这个问题的可以从 Content-Type 中得到答案,另一个是问题是上载的数据量有多少即 Content-Length ,知道了它,就...

    Java Web实现文件下载和乱码处理方法

    件上传和下载是web开发中常遇到的问题。今天小编给大家分享下Java Web实现文件下载和乱码处理方法的相关资料,需要的朋友可以参考下

    JAVA上百实例源码以及开源项目

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    Spire.Pdf.zip 读取PDF文件中的信息

    读取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(springboot) 读取txt文本内容代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    java源码包---java 源码 大量 实例

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    Java 获取视频时长、格式、大小需要的jar

    Java 获取视频时长、格式、大小需要的jar jave-1.0.2

    java源码包4

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    java源码包3

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    JAVA上百实例源码以及开源项目源代码

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    java源码包2

    通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,通常应对私钥加密后再保存、如何从...

    ganymed-ssh2-build210.jar java远程访问linux服务器操作、上传下载文件

    * 上传文件 * @param localFile 本地目录地址 * @param remoteTargetDirectory 远程目录地址 */ public void putFile(String localFile, String remoteTargetDirectory) { try { if(login()){ ...

    springmvc+spring+mybatis+mysql数据库整合读取磁盘文件存到数据库

    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 源码DEMO 4(1-4是独立压缩包)

    Java从网络取得文件 1个目标文件 简单 Java从压缩包中提取文件 1个目标文件 简单 Java存储与读取对象 1个目标文件 如题 Java调色板面板源代码 1个目标文件 摘要:Java源码,窗体界面,调色板 使用Java语言编写的一款...

    java jdk实列宝典 光盘源代码

    内容: 1 转换基本数据类型;运算符;计算阶乘; 2 复数类;java的参数传递;自定义形状类;类的加载顺序;方法和变量在继承时的覆盖和隐藏;... 上传文件; 用servlet生成图形验证码; 用servlet实现分页查看数据库;

Global site tag (gtag.js) - Google Analytics