Java IO文件編碼轉(zhuǎn)換實(shí)現(xiàn)代碼
對(duì)IO操作真心不是很懂。。。對(duì)編碼、亂碼也是一知半解。。。今天遇到了一個(gè)需求,要求將一個(gè)文件進(jìn)行編碼轉(zhuǎn)換,并且返回編碼后的字符串,如原本的GBK編碼,轉(zhuǎn)換為UTF-8
其中這個(gè)BytesEncodingDetect 類就不貼了。主要用了里面的獲取文件編碼格式。
剛開(kāi)始試了直接在源文件修改編碼方式,采用URLEncoder和URLDecoder進(jìn)行轉(zhuǎn)換,卻遲遲不行。出現(xiàn)了中文奇數(shù)最后一個(gè)字亂碼
百度找了解決方法,都未果,只好采用我的思路是:先讀取源文件的內(nèi)容,存放到StringBuffer里面,然后刪除源文件,再重新new一個(gè)文件,再以另一中編碼形式存放進(jìn)去。
查看編碼后效果:注意不要在eclipse查看效果,eclipse以一種編碼形式查看而已,所以可以在瀏覽器端查看如html文件,查看指定編碼可以右鍵---編碼,以此來(lái)判斷是否成功。
package com.test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
public class Transcoding {
private BytesEncodingDetect encode = new BytesEncodingDetect();
public Transcoding() {
}
/**
* 編碼轉(zhuǎn)換
* @param toCharset 要轉(zhuǎn)換的編碼
* @param path 要轉(zhuǎn)換的文件路徑
* @return
* @throws Exception
*/
public String encoding(String toCharset, String path) throws Exception{
File srcFile = new File(path);
int index = encode.detectEncoding(srcFile);
String charset = BytesEncodingDetect.javaname[index];
// 編碼相同,無(wú)需轉(zhuǎn)碼
if (charset.equalsIgnoreCase(toCharset)) {
return "編碼一樣,無(wú)需轉(zhuǎn)換";
}
InputStream in = new FileInputStream(path);
BufferedReader br = new BufferedReader(
new InputStreamReader(in, charset));
StringBuffer sb = new StringBuffer();
String s1;
while ((s1=br.readLine())!=null) {
String s = URLEncoder.encode(s1, toCharset);
sb.append(s+"\r\n");//一行+回車
}
br.close();
srcFile.delete();//刪除原來(lái)文件
//重新以新編碼寫入文件并返回值
File newfile = new File(path);//重新建原來(lái)的文件
newfile.createNewFile();
OutputStream out = new FileOutputStream(newfile);
OutputStreamWriter writer = new OutputStreamWriter(out, toCharset);
BufferedWriter bw = new BufferedWriter(writer);
bw.write(URLDecoder.decode(sb.toString(), toCharset));
String result = URLDecoder.decode(sb.toString(), toCharset);
bw.flush();//刷到文件中
bw.close();
return result;
}
}
相關(guān)文章
java基于jdbc連接mysql數(shù)據(jù)庫(kù)功能實(shí)例詳解
這篇文章主要介紹了java基于jdbc連接mysql數(shù)據(jù)庫(kù)功能,結(jié)合實(shí)例形式詳細(xì)分析了jdbc連接mysql數(shù)據(jù)庫(kù)的原理、步驟、實(shí)現(xiàn)方法及相關(guān)操作技巧,需要的朋友可以參考下2017-10-10Java微信公眾平臺(tái)開(kāi)發(fā)(3) 接收消息的分類及實(shí)體的創(chuàng)建
這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺(tái)開(kāi)發(fā)第三步,接收消息的分類及實(shí)體的創(chuàng)建,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04詳解SpringBoot如何優(yōu)雅的進(jìn)行全局異常處理
在SpringBoot的開(kāi)發(fā)中,為了提高程序運(yùn)行的魯棒性,我們經(jīng)常需要對(duì)各種程序異常進(jìn)行處理,但是如果在每個(gè)出異常的地方進(jìn)行單獨(dú)處理的話,這會(huì)引入大量業(yè)務(wù)不相關(guān)的異常處理代碼,這篇文章帶大家了解一下如何優(yōu)雅的進(jìn)行全局異常處理2023-07-07Java中LambdaQueryWrapper的常用方法詳解
這篇文章主要給大家介紹了關(guān)于Java中LambdaQueryWrapper常用方法的相關(guān)資料,lambdaquerywrapper是一個(gè)Java庫(kù),用于構(gòu)建類型安全的Lambda表達(dá)式查詢,需要的朋友可以參考下2023-11-11深入解析StringBuffer和StringBuilder的區(qū)別
以下是對(duì)java中StringBuffer與StringBuilder的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07IntelliJ IDEA 報(bào)錯(cuò):找不到包或者找不到符號(hào)的問(wèn)題及解決方案
這篇文章主要介紹了IntelliJ IDEA 報(bào)錯(cuò):找不到包或者找不到符號(hào)的問(wèn)題及解決方案,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08spring boot啟動(dòng)加載數(shù)據(jù)原理分析
實(shí)際應(yīng)用中,我們會(huì)有在項(xiàng)目服務(wù)啟動(dòng)的時(shí)候就去加載一些數(shù)據(jù)或做一些事情這樣的需求。這時(shí)spring Boot 為我們提供了一個(gè)方法,通過(guò)實(shí)現(xiàn)接口 CommandLineRunner 來(lái)實(shí)現(xiàn)。下面給大家詳細(xì)介紹下,需要的的朋友參考下吧2017-04-04SpringCloud添加客戶端Eureka Client過(guò)程解析
這篇文章主要介紹了SpringCloud添加客戶端Eureka Client過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03