java實現(xiàn)文件編碼轉(zhuǎn)換的方法
在開發(fā)過程中,可能會遇到文件編碼的轉(zhuǎn)換,雖然說開發(fā)工具eclipse可以轉(zhuǎn)換編碼,但是有的情況卻很不方便。比如,原來文件本身的編碼是GBK,現(xiàn)在要轉(zhuǎn)換成UTF-8,如果直接在eclipse中把文件編碼修改成UTF-8,恭喜你,是亂碼,因為不能直接從GBK到UTF-8進行轉(zhuǎn)換,這時就需要我們手動的來轉(zhuǎn)換編碼。下面是一個文件編碼轉(zhuǎn)換的工具類。
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");
}
});
}
/**
* 把指定文件或目錄轉(zhuǎn)換成指定的編碼
*
* @param fileName
* 要轉(zhuǎn)換的文件
* @param fromCharsetName
* 源文件的編碼
* @param toCharsetName
* 要轉(zhuǎn)換的編碼
* @throws Exception
*/
public static void convert(String fileName, String fromCharsetName,
String toCharsetName) throws Exception {
convert(new File(fileName), fromCharsetName, toCharsetName, null);
}
/**
* 把指定文件或目錄轉(zhuǎn)換成指定的編碼
*
* @param file
* 要轉(zhuǎn)換的文件或目錄
* @param fromCharsetName
* 源文件的編碼
* @param toCharsetName
* 要轉(zhuǎn)換的編碼
* @throws Exception
*/
public static void convert(File file, String fromCharsetName,
String toCharsetName) throws Exception {
convert(file, fromCharsetName, toCharsetName, null);
}
/**
* 把指定文件或目錄轉(zhuǎn)換成指定的編碼
*
* @param file
* 要轉(zhuǎn)換的文件或目錄
* @param fromCharsetName
* 源文件的編碼
* @param toCharsetName
* 要轉(zhuǎn)換的編碼
* @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);
}
/**
* 把指定文件或目錄轉(zhuǎn)換成指定的編碼
*
* @param file
* 要轉(zhuǎn)換的文件或目錄
* @param fromCharsetName
* 源文件的編碼
* @param toCharsetName
* 要轉(zhuǎn)換的編碼
* @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);
}
}
}
/**
* 以指定編碼方式讀取文件,返回文件內(nèi)容
*
* @param file
* 要轉(zhuǎn)換的文件
* @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
* 要轉(zhuǎn)換的編碼
* @param content
* 文件內(nèi)容
* @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();
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
并發(fā)編程之Java內(nèi)存模型volatile的內(nèi)存語義
這篇文章主要介紹了并發(fā)編程之Java內(nèi)存模型volatile的內(nèi)存語義,理解volatile特性的一個好辦法是把對volatile變量的單個讀/寫,看成是使用同一個鎖對單個讀/寫操作做了同步。下面我們一起進入文章看看具體例子吧,需要的小伙伴可以參考下2021-11-11
在Java中解析JSON數(shù)據(jù)代碼示例及說明
這篇文章主要介紹了在Java中解析JSON數(shù)據(jù)的相關(guān)資料,文中講解了如何使用Gson和Jackson庫解析JSON數(shù)據(jù),并展示了如何將日期時間字符串轉(zhuǎn)換為時間戳,通過代碼介紹的非常詳細,需要的朋友可以參考下2025-03-03
springboot項目中idea的pom.xml文件的引用標簽全部爆紅問題解決
這篇文章主要介紹了springboot項目中idea的pom.xml文件的引用標簽全部爆紅問題解決,本文通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友參考下吧2023-12-12
SpringBoot詳細講解異步任務(wù)如何獲取HttpServletRequest
在使用框架日常開發(fā)中需要在controller中進行一些異步操作減少請求時間,但是發(fā)現(xiàn)在使用@Anysc注解后會出現(xiàn)Request對象無法獲取的情況,本文就此情況給出完整的解決方案2022-04-04
java ant包中的org.apache.tools.zip實現(xiàn)壓縮和解壓縮實例詳解
這篇文章主要介紹了java ant包中的org.apache.tools.zip實現(xiàn)壓縮和解壓縮實例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
Flink開發(fā)IDEA環(huán)境搭建與測試的方法
這篇文章主要介紹了Flink開發(fā)IDEA環(huán)境搭建與測試的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03

