eclipse中文乱码究极方案

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.nio.charset.Charset;

/**
 * 读取文件内容到剪贴板,以我们想要的方式覆盖源文件。
 * 
 * 这样做。原来的中文不会改变。写入时,中文不会乱码
 */

public class FileEncodingChangeTool {

	public static void main(String[] args) {

		File file = new File("C:\\android\\workspace\\RJT_Android\\src");
		try {
			// 1。通过用不同的编码读取指定文件,可以判断该文件可能的编码(通过看显示是否有乱码来确定),以保证正确设置charsetNameOld
			// String charsetNameOld= "GB2312";
			String charsetNameOld = "GBK";
			// String charsetNameOld= "ISO-8859-1";
			// String charsetNameOld= "UTF-8";
			// String content=getFileContentWithCharsetName(file,charsetNameOld);
			// System.out.println(content);

			// 2。转换
			String charsetNameNew = "UTF-8";

			changeFileEncoding(file, charsetNameOld, charsetNameNew);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 改变文件的编码(改的是二进制数据,注意不是改变eclipse文件的读取编码的设置,后者只是指定读取文件内容到内存中的读取时编码并没有改变二进制文件)
	 * 
	 * @param file,如 new File("D:\\java_workplace\\实验室主\\src\\wen\\coding\\1.txt")
	 * @param charsetNameOld,如"GBK"
	 * @param charsetNameNew,如"UTF-8"
	 * @throws IOException
	 * @throws Exception
	 */
	public static void changeFileEncoding(File file, String charsetNameOld, String charsetNameNew) throws IOException {

		if (file.isFile() && file.getName().endsWith(".java") && (!file.getName().contains("svn"))) {
			System.out.println("我是文件");
			String content = getFileContentWithCharsetName(file, charsetNameOld);
			saveFileWithCharsetName(file, charsetNameNew, content);
		} else if (file.isDirectory()) {
			System.out.println("我是目录");
			File[] files = file.listFiles();
			if (files != null) {
				for (File f : files) {
					System.out.println("单个文件路径:" + f.getAbsolutePath());
					changeFileEncoding(f, charsetNameOld, charsetNameNew);
				}
			}
		}
	}

	/**
	 * 以指定编码保存文件,方法1:构造指定编码的 Writer 来写入字符串
	 * ,存在会覆盖
	 * 
	 * @param file
	 * @param charsetName
	 * @param content
	 * @throws IOException
	 * @throws Exception
	 */
	public static void saveFileWithCharsetName(File file, String charsetName, String content) throws IOException {
		FileOutputStream fileOut = new FileOutputStream(file);
		OutputStreamWriter outWrite = new OutputStreamWriter(fileOut, Charset.forName(charsetName));
		outWrite.write(content);
		outWrite.close();
	}

	/**
	 * 以指定编码方式读取文本文件,返回文件内容
	 * 【
	 * 不确定文件编码的时候可以试试看读取是否正常。
	 * String charsetNameOld= "GB2312";
	 * String charsetNameOld= "ISO-8859-1";
	 * 】
	 * 
	 * @param file
	 * @param charsetName
	 * @return
	 * @throws IOException
	 * @throws Exception
	 */
	public static String getFileContentWithCharsetName(File file, String charsetName) throws IOException {
		FileInputStream fileIn = new FileInputStream(file);
		InputStreamReader inRead = new InputStreamReader(fileIn, Charset.forName(charsetName));
		int size = (int) (file.length());
		char[] chs = new char[size];
		inRead.read(chs);
		String str = new String(chs).trim();
		inRead.close();
		return str;
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值