`

关于文件转码的代码例题

J# 
阅读更多
引用

package org.tarena.day03;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class FileUtil {
	
	//多转码如:gbk转码Utf-8;
	//gbk 每个字符占2个字节;
	//utf-8 每个字符占3个字节,每个英文字母占一个字节;
	static void copy(File from,File to,
			String charsetFrom,String charsetTo) throws Exception{
		InputStreamReader in = new InputStreamReader(
				new FileInputStream(from),charsetFrom);
		OutputStreamWriter out = new OutputStreamWriter(
				new FileOutputStream(to),charsetTo);//在这里要添加编码转换方式;
		char[] cbuf = new char[1024];
		int n;
		while((n=in.read(cbuf))!=-1){
			out.write(cbuf, 0, n);
		}
		in.close();
		out.close();
	}
	//创建gbk的文本文件;
	static void createTextGbk(File fl) throws Exception{
		OutputStreamWriter out = new OutputStreamWriter(
				new FileOutputStream(fl),"GBK");
		char[] cbuf = {'你','好',',','j','a','v','a'};
		out.write(cbuf);
		out.close();
	}
	
	public static void main(String[] args) throws Exception{
		File gbk = new File("/home/soft22/Desktop/gbk.txt");
		createTextGbk(gbk);
		File utf = new File("/home/soft22/Desktop/utf.txt");
		copy(gbk,utf,"GBK","UTF-8");
		
	}

}
	


char[] cbuf = {'你','好',',','j','a','v','a'};
		out.write(cbuf);
//显示结果:你好,java


gbk 文本文件:


gbk 每个字符占2个字节;
utf-8 文本文件:


utf-8 每个字符占3个字符,每个英文字母占一个字节;

引用

编码的方式:
每个字符对应一个整数。不同的国家有不同的编码,当编码方式和解码方式不统一时,产生乱码。因为美国最早发展软件,所以每种的编码都向上兼容 ASCII 所以英文没有乱码。
ASCII(数字、英文)1 个字符占一个字节(所有的编码集都兼容 ASCII)
ISO8859-1(欧洲)     1 个字符占一个字节
GB-2312/GBK               1 个字符占两个字节
Unicode                         1 个字符占两个字节(网络传输速度慢)
UTF-8                            变长字节,对于英文一个字节,对于汉字两个或三个字节。

InputStreamReader 和 OutputStreamWriter(字节流转化成字符流的桥转换器)
这两个类不是用于直接输入输出的,他是将字节流转换成字符流的桥转换器,并可以指定编解码方式。

Reader 和 Writer (字符流类,所有字符流的父类型)
1) Java 技术使用 Unicode 来表示字符串和字符,而且提供 16 位版本的流,以便用类似的方法处理字符。
2) InputStreamReader 和 OutputStreamWriter 作为字节流与字符流中的接口。
3) 如果构造了一个连接到流的 Reader 和 Writer,转换规则会在使用缺省平台所定义的字节编码和 Unicode之间切换。

BufferedReader/(BufferedWriter,不常用)(这两个类需要桥转换)
PrintWriter(带缓存的字符输出流,不需要桥转换)
常用输入输出类型,不需要桥接,其中其它方法请参看 API 文档。
以上两个都是过滤流,需要用其他的节点流来作参数构造对象。
BufferedReader 的方法:readLine():String ,当他的返回值是 null 时,就表示读取完毕了。要注意,再写入时要注意写换行符,否则会出现阻塞。
BufferedWriter 的方法:newLine() ,这个方法会写出一个换行符。
PrintWriter 的方法:println(….String,Object 等等)和 write(),println(...)这个方法就不必再写换行符了,
在使用时会自动换行。
注意:在使用带有缓冲区的流时,在输入之后就要 flush()方法,把缓冲区数据发出去。


原则:保证编解码方式的统一,才能不至于出现错误。
java.io 包的 InputStreamread 输入流的从字节流到字符流的桥转换类。这个类可以设定字符转换方式。
OutputStreamred:输出流的字节流桥转换成字符流
Bufferread 有 readline()使得字符输入更加方便。
在 I/O 流中,所有输入方法都是阻塞方法。
Bufferwrite 给输出字符加缓冲,因为它的方法很少,所以使用父类 PrintWrite,它可以使用字节流对象,
而且方法很多。

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

Global site tag (gtag.js) - Google Analytics