java實(shí)現(xiàn)文件編碼轉(zhuǎn)換的方法
在開發(fā)過程中,可能會(huì)遇到文件編碼的轉(zhuǎn)換,雖然說開發(fā)工具eclipse可以轉(zhuǎn)換編碼,但是有的情況卻很不方便。比如,原來文件本身的編碼是GBK,現(xiàn)在要轉(zhuǎn)換成UTF-8,如果直接在eclipse中把文件編碼修改成UTF-8,恭喜你,是亂碼,因?yàn)椴荒苤苯訌腉BK到UTF-8進(jìn)行轉(zhuǎn)換,這時(shí)就需要我們手動(dòng)的來轉(zhuǎn)換編碼。下面是一個(gè)文件編碼轉(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;
}
/**
* 以指定編碼方式寫文本文件,存在會(huì)覆蓋
*
* @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();
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
并發(fā)編程之Java內(nèi)存模型volatile的內(nèi)存語(yǔ)義
這篇文章主要介紹了并發(fā)編程之Java內(nèi)存模型volatile的內(nèi)存語(yǔ)義,理解volatile特性的一個(gè)好辦法是把對(duì)volatile變量的單個(gè)讀/寫,看成是使用同一個(gè)鎖對(duì)單個(gè)讀/寫操作做了同步。下面我們一起進(jìn)入文章看看具體例子吧,需要的小伙伴可以參考下2021-11-11
在Java中解析JSON數(shù)據(jù)代碼示例及說明
這篇文章主要介紹了在Java中解析JSON數(shù)據(jù)的相關(guān)資料,文中講解了如何使用Gson和Jackson庫(kù)解析JSON數(shù)據(jù),并展示了如何將日期時(shí)間字符串轉(zhuǎn)換為時(shí)間戳,通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-03-03
springboot項(xiàng)目中idea的pom.xml文件的引用標(biāo)簽全部爆紅問題解決
這篇文章主要介紹了springboot項(xiàng)目中idea的pom.xml文件的引用標(biāo)簽全部爆紅問題解決,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-12-12
SpringBoot詳細(xì)講解異步任務(wù)如何獲取HttpServletRequest
在使用框架日常開發(fā)中需要在controller中進(jìn)行一些異步操作減少請(qǐng)求時(shí)間,但是發(fā)現(xiàn)在使用@Anysc注解后會(huì)出現(xiàn)Request對(duì)象無法獲取的情況,本文就此情況給出完整的解決方案2022-04-04
java ant包中的org.apache.tools.zip實(shí)現(xiàn)壓縮和解壓縮實(shí)例詳解
這篇文章主要介紹了java ant包中的org.apache.tools.zip實(shí)現(xiàn)壓縮和解壓縮實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04
Flink開發(fā)IDEA環(huán)境搭建與測(cè)試的方法
這篇文章主要介紹了Flink開發(fā)IDEA環(huán)境搭建與測(cè)試的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(45)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07

