Java IO文件编码转换

2014-11-24 07:32:12 · 作者: · 浏览: 0

对IO操作真心不是很懂。。。对编码、乱码也是一知半解。。。今天遇到了一个需求,要求将一个文件进行编码转换,并且返回编码后的字符串,如原本的GBK编码,转换为UTF-8


其中这个BytesEncodingDetect 类就不贴了。主要用了里面的获取文件编码格式。

刚开始试了直接在源文件修改编码方式,采用URLEncoder和URLDecoder进行转换,却迟迟不行。出现了中文奇数最后一个字乱码

百度找了解决方法,都未果,只好采用我的思路是:先读取源文件的内容,存放到StringBuffer里面,然后删除源文件,再重新new一个文件,再以另一中编码形式存放进去。

查看编码后效果:注意不要在eclipse查看效果,eclipse以一种编码形式查看而已,所以可以在浏览器端查看如html文件,查看指定编码可以右键---编码,以此来判断是否成功。

package com.test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;

public class Transcoding {
	private BytesEncodingDetect encode = new BytesEncodingDetect();
	public Transcoding() {
	}

	/**
	 * 编码转换
	 * @param toCharset 要转换的编码
	 * @param path 要转换的文件路径
	 * @return
	 * @throws Exception
	 */
	public String encoding(String toCharset, String path) throws Exception{
		File srcFile = new File(path);
		int index = encode.detectEncoding(srcFile);
		String charset = BytesEncodingDetect.javaname[index];
		// 编码相同,无需转码
		if (charset.equalsIgnoreCase(toCharset)) {
			return "编码一样,无需转换";
		}
		
		InputStream in = new FileInputStream(path);
		
		BufferedReader br = new BufferedReader(
				new InputStreamReader(in, charset));
		
		StringBuffer sb = new StringBuffer();
		String s1;
		while ((s1=br.readLine())!=null) {
			String s = URLEncoder.encode(s1, toCharset);
			sb.append(s+"\r\n");//一行+回车
		}
		
		br.close();
		srcFile.delete();//删除原来文件
		//重新以新编码写入文件并返回值
		File newfile = new File(path);//重新建原来的文件
		newfile.createNewFile();
		OutputStream out = new FileOutputStream(newfile);
		OutputStreamWriter  writer = new OutputStreamWriter(out, toCharset);
		BufferedWriter bw = new BufferedWriter(writer);
		bw.write(URLDecoder.decode(sb.toString(), toCharset));
		String result = URLDecoder.decode(sb.toString(), toCharset);
		bw.flush();//刷到文件中
		bw.close();
		return result;
	}

}