2016-08-09 63 views
4

我讀取編碼文件時遇到問題,以前在我自己的代碼上編寫過。Java - 無法正確讀取先前創建的編碼文件

原始字符串正確顯示(包括重音符號)

我的代碼來保存字符串的編碼文件如下:

OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(fileName), 
     "ISO-8859-1"); 
writer.write(text); 

然後,我讀這樣的文件:

InputStream is = getClass.getResourceAsStream(fileName); 

try {   
    BufferedReader br = new BufferedReader(new InputStreamReader(is, "ISO-8859-1")); 
    String line; 
    StringBuilder sb = new StringBuilder(); 

    while((line = br.readLine()) != null) { 
     sb.append(line); 
    } 

    String result = sb.toString(); 
} catch (UnsupportedEncodingException e3) { 
} catch (IOException e) { } 

字符串結果未正確顯示。例如,重音標記丟失。

我也嘗試過其他方式,比如將字符串編碼爲字節,然後將這些字節寫入文件。我總是得到相同的結果,也與其他ISO編碼。任何想法?

+0

API工作正常,在終端的編碼設置中必定存在其他一些錯誤。 – Kennet

+0

您在文件系統上編寫了一個文件,但讀取發生在資源上,類路徑上,可能打包在jar或war中。這可能意味着你正在談論兩個不同的文件,也許你的源代碼目錄中有一個文件,一個在build目錄或jar文件中。在書面文章之前,閱讀甚至可能在緩存版本上。更改內容以檢查該內容。 (然後'append(「\ r \ n」)'丟失,就像關閉的調用一樣)。 –

+0

無法重現。如果讀取的文件與編寫相同的編碼相同,則會得到相同的字符 - 但我必須添加一個明確的'writer.close()'才能真正寫入。會發生什麼:不按照Joop建議的方式閱讀預期文件,在錯誤配置的終端上顯示文件之一等等。但它不是** Java轉換問題。 –

回答

0

問題是你的字符串有不同的字符集,可能是UTF-16。輸出的文本作爲您需要的字符集

這樣的回答表明了syntax

+0

你能否詳細說明*你的字符串有不同的字符集,可能是UTF-16 *?當然有! Java規範說,字符串在內部是UTF16編碼的。但這與問題完全無關。 –

+0

你的問題不是爲什麼stringbuilder錯誤地輸出字符?原因是stringbuilder.toString正在輸出UTF-16 – farrellmr

+0

UTF-16的直接輸出幾乎只發生在GUI程序中,因爲命令行界面在普通系統(Linux,Windows,Mac)上使用8位字符。當您使用'System.out.println'時,字符串會自動以系統默認編碼進行編碼。但它確實可能是終端窗口編碼的問題。你的回答並不差,並顯示問題可能出在哪裏,但你給出的理由不是正確的。 –

0

問題解決了!

它與代碼中的任何錯誤都沒有關係。我目前正在一個團隊中工作,該項目是由Maven製作的。

目前我建立的項目,Maven將所有資源複製到另一個文件夾,以UTF-8編碼它們。在代碼中,獲取資源時,它讀取的文件不是原始文件,而是由Maven生成的UTF-8編碼文件。

對不起,沒有發佈這個細節,我是新的Maven,我不知道它可能會導致這種問題。

謝謝大家的回答!