(好文!!)FileReader读取文件,由于不确定源文件的编码格式不同,导致读出的文件乱码的问题

原创 2012年03月22日 05:02:15

直接上代码:

package org.bruce.file.handle.experiment;

import java.io.File;
import java.io.FileInputStream;

import org.apache.commons.io.IOUtils;

/**
 * @author user
 * apache 的 IOUtils 这个类真的很好用~
 */
public class TestIOUtils {
	
	public static String _absPath1 = "/Users/user/Novels/txt/猎头.txt";

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		File f = new File(_absPath1);
		FileInputStream fis = new FileInputStream(f);
		
		// 无损读取,Integer.MAX_VALUE = 21 亿 4748 万 3648 = 2G (Byte)~
		byte[] bytes = IOUtils.toByteArray(fis);
		
		System.out.println(bytes.length);
		
		/** 以下三句代码的效果是相通的~ */
		String str1 = new String(bytes);	// 按JVM的默认字符集 UTF-8 进行解码~
//		String str1 = new String(bytes, 0, bytes.length);	// 同上~
//		String str1 = new String(bytes, "UTF-8");
		System.out.println(str1);
		
		// 还原编码
		String str2 = new String(bytes, "GBK");
		System.out.println(str2);
	}

}
org.apache.commons.io.IOUtils
是Apache commons IO 里面的一个工具类
此类所在的 jar 包可以在这里下载到(只用到部分功能,我动手“精简”了一下):

http://download.csdn.net/detail/yang3wei/4163965


参考资料:http://liudeh-009.iteye.com/blog/1312117

读取一个UTF-8编码格式的文件,代码中起初用FileReader读取到一个字符串,然后转换字符集,结果就出问题了:

文件读入时是按OS的默认字符集即GBK解码的,我先用默认字符集GBK编码str.getBytes(“GBK”),此时应该还原为文件中的字节序列了,

然后再按UTF-8解码,生成的字符串按理说应该就应该是正确的。

为什么结果中还是有部分乱码呢?

问题出在FileReader读取文件的过程中,FileReader继承了InputStreamReader,但并没有实现父类中带字符集参数的构造函数,

所以FileReader只能按系统默认的字符集来解码,然后在UTF-8 -> GBK -> UTF-8的过程中编码出现损失,造成结果不能还原最初的字符。

之前还碰到过一个问题,读取一个别人上传的文件,本来约束是这个文件啊必须是UTF-8的,但是用户上传的文件,却是用GBK

编码的,导致将这个文件流读出,使用时,发现乱码无法真确识别其中信息。

如何解决呢?

首先,我不管源文件是采用什么编码,取得文件流,然后用org.apache.commons.io.IOUtils.toByteArray这个工具类中的API

FileInputStreamstream = new FileInputStream(targetFile);

byte[] bytes = IOUtils.toByteArray(stream);

这样,就将文件流转化成字节数组,并且不丢失字节;然后,每个文件都有一段头信息,描述文件的字符编码,文件大小等等的信息,同一类字符编码的文件,

头几个字节是相同的,可以以此来判断文件的字符编码类型例如:UTF-8的文件,头2个字节,分别是‘-17’和‘-69’,;接着可以用String的带字符集的构造函数,

把文件还原出来

另外,clps中不单需要读取源代码,还需要修改源代码,这时候,一定要保证编码格式的一致性,我采用的方式,模仿了文件的格式,返回给页面的

是一个文件对象,包含了文件内容实体,字符编码格式等信息,这样保存的时候,就可以得到这些信息。


版权声明:本文为博主原创文章,未经博主允许不得转载。

IO 流读取文件时候出现乱码 文件编码格式问题 怎么转换解决方法

在使用下面这个写法时候UTF-8文件编码 在读取时候出现乱码问题。 File myFile=new File("文件路径"); Java代码   BufferedReader in = new...

【PHP-文件下载】遇到的编码格式不正确导致文件下载后乱码、文件大小发生改变的问题

上面说到过文件上传的过程,现在详细说一下文件的下载过程,在下载过程中,曾遇到过下载的文件与原上传文件,大小不一,乱码的情况,现在将详细叙述问题解决的全过程。 先简单说下编码格式, header("C...

批量修改文件的编码格式-问题来自于用Source Insight打开项目时中文部分出现乱码

工具:EditPlus 步骤: (1)  打开某一个文件夹中一个文件,然后在软件EditPlus左侧,按住Shift选中所有文件,也可部分,根据你的需要,如下图所示 (2)  单击菜单栏的文档--...

Eclipse中各种文件【默认编码格式设置】,防止乱码等问题

Eclipse之文件【默认编码格式设置】,防止乱码等问题 文件默认编码格式设置步骤...

Dom4j保存数据乱码以及xml文件头编码格式改变的原因和解决方法

dom4j解析xml文档请参考:java解析xml的方式总结 dom4j对xml文档进行增删改查后都要将数据写回原文件,有时会出现乱码。 产生乱码原因:         此时,不管xml文档的编码格...
  • zyh5540
  • zyh5540
  • 2013年07月24日 16:26
  • 1683

读取和写入不同编码格式的文件

BOOL CStdioFileEx::ReadString(CString& rString) { const int nMAX_LINE_CHARS = 4096; BOOL bReadDat...
  • ghevinn
  • ghevinn
  • 2012年08月17日 15:57
  • 751

常见的编码格式/txt文件乱码

常见的编码格式  比较常见的编码格式大体上可以分为ASCII编码和Unicode编码。 ASCII编码 ASCII编码:是出现最早的编码格式。属于单字节编码ASCII码使用7bit表示一个字符,共1...

Ant 执行 YUICompressor 任务压缩 JavaScript 和 CSS 文件,解决中文乱码问题,增加源文件字符编码集设定

发布 JavaScript 的时候,无论从代码保护还是提高性能角度,都应该对代码进行压缩,去除重叠的空白分隔符,混淆变量。雅虎交互(YUI)提供了非常强大的压缩工具,对 .js 文件和 .css 文件...

BufferedReader和FileReader读取txt文件乱码问题

读取txt文件乱码    BufferedReader read = new BufferedReader(new FileReader(new File(filename)));  解决...
  • chjie
  • chjie
  • 2012年10月25日 23:26
  • 382

eclipse编码格式全部正确,网页中文显示依旧乱码问题

中文乱码问题真的是一个很棘手的问题,特别是从前台传到后台之后,都不知道问题出在哪里了。现在分享解决javaWEB中前后台中文乱码问题的3种方法。 方法一: tomcat的自带编码是ISO-8859...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(好文!!)FileReader读取文件,由于不确定源文件的编码格式不同,导致读出的文件乱码的问题
举报原因:
原因补充:

(最多只允许输入30个字)