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;
}
}
eclipse中文乱码究极方案
最新推荐文章于 2022-06-24 18:27:04 发布