2011-02-11 44 views
73

我試圖通過互聯網逐行讀取text/plain文件。我現在所擁有的代碼是:將InputStream讀取爲UTF-8

URL url = new URL("http://kuehldesign.net/test.txt"); 
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 
LinkedList<String> lines = new LinkedList(); 
String readLine; 

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

for (String line : lines) { 
    out.println("> " + line); 
} 

文件,test.txt,包含¡Hélló!,我使用,以測試其編碼。

當我查看OutputStreamout)時,我將其視爲> ¬°H√©ll√≥!。我不認爲這是OutputStream的問題,因爲我可以做out.println("é");沒有問題。

讀取形式爲InputStream爲UTF-8的任何想法?謝謝!

+1

HTTP協議指定編碼。你爲什麼不使用庫API來處理它?你不應該像這樣猜測編碼。我不是故意否定的:你做得很好!我只是想知道是否沒有更簡單的方法。 – tchrist 2011-02-11 01:25:51

+1

不幸的是,我將無法訪問服務於「text/plain」文件的服務器,並且它不使用UTF-8編碼。我沒有意識到任何好的網絡庫;有什麼建議麼? – 2011-02-11 01:39:19

+1

看着[文檔](http://download.oracle.com/javase/6/docs/api/java/net/URL.html),我不認爲你將不得不指定編碼。我很驚訝他們給你一個字節流!您可以訪問底層的[URLConnection](http://download.oracle.com/javase/6/docs/api/java/net/URLConnection.html),您可以從中檢查Content-Encoding,然後打開帶有正確參數的InputStreamReader。對源代碼的快速檢查並沒有發現任何似乎對你有用的事情,這看起來很蹩腳且容易出錯,所以我可能錯過了一些東西。 – tchrist 2011-02-11 01:48:29

回答

146

解決了我自己的問題。這條線:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); 

需求是:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8")); 

或自從Java 7:

BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8)); 
13
String file = ""; 

    try { 

     InputStream is = new FileInputStream(filename); 
     String UTF8 = "utf8"; 
     int BUFFER_SIZE = 8192; 

     BufferedReader br = new BufferedReader(new InputStreamReader(is, 
       UTF8), BUFFER_SIZE); 
     String str; 
     while ((str = br.readLine()) != null) { 
      file += str; 
     } 
    } catch (Exception e) { 

    } 

試試這個,.. :-)

0

我跑每遇到一個特殊的字符就將它標記爲into。要解決這個問題,我嘗試使用的編碼:ISO-8859-1

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("txtPath"),"ISO-8859-1")); 

while ((line = br.readLine()) != null) { 

} 

我希望這可以幫助任何人誰看到這個帖子。