2011-11-13 121 views
1

我正在從ftp下載一個帶有通用ftp庫的文本文件。來自txt文件的特殊字符

問題是,當我逐行讀取文件到數組中時,它並不需要諸如字符之類的字符。相反,它只是顯示「?」字符。

這裏是我的代碼

FileInputStream fstream = openFileInput("name of text file"); 
    BufferedReader br = new BufferedReader(new InputStreamReader(fstream, "UTF-8")); 
    String strLine; 

    ArrayList<String> lines = new ArrayList<String>(); 

    while ((strLine = br.readLine()) != null) { 
     lines.add(strLine); 
    } 

    String[] linjer = lines.toArray(new String[0]); 

    ArrayList<String> imei = new ArrayList<String>(); 

    for(int o=0;o<linjer.length;o++) 
    { 
     String[] holder = linjer[o].split(" - "); 
     imei.add(holder[0] + " - " + holder[2]); 
    } 

    String[] imeinr = imei.toArray(new String[0]); 

我試圖把UTF-8在我的InputStreamReader,和我有一個UnicodeReader類試過,但沒有成功。

我對Java相當陌生,所以可能只是一些愚蠢的問題,但希望你能提供幫助。 :)

+0

您的代碼看起來正確。你怎麼知道字符不能正確讀取?可能你的問題是在處理或顯示字符串的代碼中? – AlexR

回答

4

沒有理由使用DataInputStreamDataInputStreamDataOutputStream類用於序列化原始Java數據類型(「序列化」意味着讀/寫數據到文件)。您只是逐行讀取文本文件的內容,因此使用DataInputStream是不必要的,並且可能會產生不正確的結果。

FileInputStream fstream = openFileInput("name of text file"); 
//DataInputStream in = new DataInputStream(fstream); 
BufferedReader br = new BufferedReader(new InputStreamReader(fstream, "UTF-8")); 

專業的Java程序員提示:本的foreach循環最近添加到Java編程語言。它允許程序員迭代數組的內容而不需要定義循環計數器。這簡化了您的代碼,使其隨着時間的推移更容易閱讀和維護。

for(String line : linjer){ 
    String[] holder = line.split(" - "); 
    imei.add(holder[0] + " - " + holder[2]); 
} 

注意:Foreach循環也可以與List對象一起使用。

+0

已經有很多開發人員使用DataInputStream來處理文本的不好的例子,我一直在去除它們。 –

2

我建議該文件可能不是UTF-8。它可能在CP1252之類,特別是如果你使用Windows。

嘗試下載文件並在本地副本上運行代碼以查看是否有效。

+0

我試着下載它,並在Notepad ++中打開它,它表示它是ANSI,並顯示出來。 那麼如何打開文件爲ansi。 – NikolajSvendsen

+0

如果您關閉新的InputStreamReader()的「UTF-8」參數,我相信Java會爲您做正確的事情。 – SystemParadox