首先我們必須明確一點,為什么正常轉換會亂碼?
因為我們的數據寫入是GBK寫入的,然后展示的話是按照文件保存形勢展示的,前面保存形勢是GBK,一致,所以不亂碼,而后面將保存形勢變成了UTF-8,但是寫入的內容是GBK形勢的,編碼解碼方式不一致,所以產生亂碼。
我們一般的解決亂碼的思路是:
String s=new String(str.getBytes("GBK"),"UTF-8");
我將它解決的思路也是這樣子的:
首先我們知道引起亂碼的只是因為中文,中文亂碼的方式看起來就是上面那樣解決的。
將文件的編碼改變,而且里面的內容的編寫編碼也隨之改變,很顯然不是單純地對文件進行格式改變,改變格式的同時必定要改變文件的內容。
我的初步想法:
將文件內容讀取到流中,然后按指定編碼寫入到目標文件中。
過程:
將目標文件取讀到流中
讀取源文件中的信息用字符串的形式展示,
將字符串寫入目標文件
注意問題:
1、讀取目標文件默認讀取編碼是當前項目編碼而不是源文件編碼,我們可以使用FileInputStream的含有編碼方式的構造達到我們的要求
2、取讀每一行字符串后的寫入其實是不需要轉換字符串格式的。就像我就犯了一個錯誤,我前面將讀取成功的字符串通過new String(getBytes("GBK"),"UTF-8");的形式再次寫入文件中,導致一直亂碼,忽略了一個問題,就是我讀取文件的時候其實已經解碼了,此時字符串的編碼方式應該就是我的項目編碼方式了。
3、讀取完一行數據記得的換行
其他的問題就是:
將文件夾中的所有指定文件都進行編碼格式的改變,一個遞歸調用指定方法的過程罷了!
代碼實現:
import org.apache.commons.io.IOUtils; import java.io.*; import java.util.ArrayList; /** * Created by Administrator on 2016/12/1. */ public class Test { String ROUTE_URL="D:/test"; String srcEncode; ArrayList<File> fileArray=new ArrayList<File>(); public void trans(String filePath) throws Exception{ getFileClass(new File(filePath)); for (File file:fileArray){ transEncode(file.getAbsolutePath()); } } /** * 將文件由GBK格式讀取,UTF-8格式寫入 * 運行的項目應該是UTF-8的項目 * filePath用相對路徑方便轉移。如果使用絕對路徑自己改一下輸出流的url */ public void transEncode(String filePath) throws Exception{ File target=new File(ROUTE_URL,filePath); FileInputStream fis=new FileInputStream(filePath); BufferedReader br=new BufferedReader(new InputStreamReader(fis,srcEncode)); FileOutputStream fos=new FileOutputStream(target); IOUtils.copy(br,fos); fos.flush(); fis.close(); fos.close(); } /* * 遞歸遍歷指定目錄下的指定后綴文件 */ /* * 返回值類型 void * 參數列表 文件夾File * 出口條件:文件,后綴名是.class,如果排除的話加!即可.多個可使用全局變量 * */ public void getFileClass(File file){ File[] files=file.listFiles(); for(File f:files){ if(f.isDirectory()){ getFileClass(f); }else{ if(f.getName().endsWith(".java") || f.getName().endsWith(".jsp")){ System.out.println(f.getAbsolutePath()); fileArray.add(f); } } } } }
