在開發過程中,可能會遇到文件編碼的轉換,雖然說開發工具eclipse可以轉換編碼,但是有的情況卻很不方便。比如,原來文件本身的編碼是GBK,現在要轉換成UTF-8,如果直接在eclipse中把文件編碼修改成UTF-8,恭喜你,是亂碼,因為不能直接從GBK到UTF-8進行轉換,這時就需要我們手動的來轉換編碼。下面是一個文件編碼轉換的工具類。
package com.mikan.stuff; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.nio.charset.Charset; import java.nio.charset.UnsupportedCharsetException; public class FileCharsetConverter { public static void main(String[] args) throws Exception { convert("D://stuff//src//main//java//com//mikan//stuff//test.txt", "GBK", "UTF-8", new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith("txt"); } }); } /** * 把指定文件或目錄轉換成指定的編碼 * * @param fileName * 要轉換的文件 * @param fromCharsetName * 源文件的編碼 * @param toCharsetName * 要轉換的編碼 * @throws Exception */ public static void convert(String fileName, String fromCharsetName, String toCharsetName) throws Exception { convert(new File(fileName), fromCharsetName, toCharsetName, null); } /** * 把指定文件或目錄轉換成指定的編碼 * * @param file * 要轉換的文件或目錄 * @param fromCharsetName * 源文件的編碼 * @param toCharsetName * 要轉換的編碼 * @throws Exception */ public static void convert(File file, String fromCharsetName, String toCharsetName) throws Exception { convert(file, fromCharsetName, toCharsetName, null); } /** * 把指定文件或目錄轉換成指定的編碼 * * @param file * 要轉換的文件或目錄 * @param fromCharsetName * 源文件的編碼 * @param toCharsetName * 要轉換的編碼 * @param filter * 文件名過濾器 * @throws Exception */ public static void convert(String fileName, String fromCharsetName, String toCharsetName, FilenameFilter filter) throws Exception { convert(new File(fileName), fromCharsetName, toCharsetName, filter); } /** * 把指定文件或目錄轉換成指定的編碼 * * @param file * 要轉換的文件或目錄 * @param fromCharsetName * 源文件的編碼 * @param toCharsetName * 要轉換的編碼 * @param filter * 文件名過濾器 * @throws Exception */ public static void convert(File file, String fromCharsetName, String toCharsetName, FilenameFilter filter) throws Exception { if (file.isDirectory()) { File[] fileList = null; if (filter == null) { fileList = file.listFiles(); } else { fileList = file.listFiles(filter); } for (File f : fileList) { convert(f, fromCharsetName, toCharsetName, filter); } } else { if (filter == null || filter.accept(file.getParentFile(), file.getName())) { String fileContent = getFileContentFromCharset(file, fromCharsetName); saveFile2Charset(file, toCharsetName, fileContent); } } } /** * 以指定編碼方式讀取文件,返回文件內容 * * @param file * 要轉換的文件 * @param fromCharsetName * 源文件的編碼 * @return * @throws Exception */ public static String getFileContentFromCharset(File file, String fromCharsetName) throws Exception { if (!Charset.isSupported(fromCharsetName)) { throw new UnsupportedCharsetException(fromCharsetName); } InputStream inputStream = new FileInputStream(file); InputStreamReader reader = new InputStreamReader(inputStream, fromCharsetName); char[] chs = new char[(int) file.length()]; reader.read(chs); String str = new String(chs).trim(); reader.close(); return str; } /** * 以指定編碼方式寫文本文件,存在會覆蓋 * * @param file * 要寫入的文件 * @param toCharsetName * 要轉換的編碼 * @param content * 文件內容 * @throws Exception */ public static void saveFile2Charset(File file, String toCharsetName, String content) throws Exception { if (!Charset.isSupported(toCharsetName)) { throw new UnsupportedCharsetException(toCharsetName); } OutputStream outputStream = new FileOutputStream(file); OutputStreamWriter outWrite = new OutputStreamWriter(outputStream, toCharsetName); outWrite.write(content); outWrite.close(); } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。
新聞熱點
疑難解答
圖片精選