FileReader读取文件,由于不确定源文件的编码格式不同,导致读出的文件乱码的问题
2013-07-26 09:59
1456 查看
直接上代码:
[java] view
plaincopy
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);
}
}
[java] view
plaincopy
org.apache.commons.io.IOUtils
[java] view
plaincopy
是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中不单需要读取源代码,还需要修改源代码,这时候,一定要保证编码格式的一致性,我采用的方式,模仿了文件的格式,返回给页面的
是一个文件对象,包含了文件内容实体,字符编码格式等信息,这样保存的时候,就可以得到这些信息。
[java] view
plaincopy
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);
}
}
[java] view
plaincopy
org.apache.commons.io.IOUtils
[java] view
plaincopy
是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中不单需要读取源代码,还需要修改源代码,这时候,一定要保证编码格式的一致性,我采用的方式,模仿了文件的格式,返回给页面的
是一个文件对象,包含了文件内容实体,字符编码格式等信息,这样保存的时候,就可以得到这些信息。
相关文章推荐
- FileReader读取文件,由于不确定源文件的编码格式不同,导致读出的文件乱码的问题
- (好文!!)FileReader读取文件,由于不确定源文件的编码格式不同,导致读出的文件乱码的问题
- (好文!!)FileReader读取文件,由于不确定源文件的编码格式不同,导致读出的文件乱码的问题
- IO 流读取文件时候出现乱码 文件编码格式问题 怎么转换解决方法
- 安装oracle数据库后遇到数据入库为乱码的问题-由于oracle编码和系统编码不同导致
- BOM与读取UTF-8编码格式文件首行乱码问题
- IO 流读取文件时候出现乱码 文件编码格式问题 怎么转换解决方法
- 【PHP-文件下载】遇到的编码格式不正确导致文件下载后乱码、文件大小发生改变的问题
- 【string编码格式】Android读取txt文件乱码问题
- WinEdt 读取tex源文件由于编码不一致导致读取失败的问题
- IO 流读取文件时候出现乱码 文件编码格式问题 怎么转换解决方法
- 解决python with 在写入文件是因编码格式不同而造成乱码问题
- 解决Javascript由于编码不同造成乱码的问题
- 解决Javascript由于编码不同造成乱码的问题
- servlet从服务器磁盘文件读出到浏览器显示,中文乱码问题,不要忘记在输入流和输出流都要设置编码格式,否则一个地方没设置不统一就会各种乱码
- JDBC读取Oracle的US7ASCII编码中文乱码及不同编码下汉字占用字节的问题
- 页面文件存储字符集和META指定字符集不同 导致乱码问题
- A网站引用B服务器虚拟目录文件导致:网站部署到IIS7上出现HTTP 错误 500.19(由于权限不足而无法读取配置文件)的问题
- FileReader读取文件乱码问题
- android读取文件时乱码的问题,以及eclipse中java编码查看方式