2011-12-30 21 views
4

我有一個程序,我在寫我正在使用另一家公司的圖書館從他們的網站下載一些報告。我想在將這些報告寫入文件之前解析這些報告,因爲如果它們符合某些標準,我想忽略它們。從Java.io.Reader獲取有意義的文本

問題是,他們的方法,稱爲download()返回一個java.io.Reader。唯一可用的方法是

int read(char[] cbuf); 

打印此返回的數組使我失去意義的字符。我希望能夠確定我正在使用的字符集或將其轉換爲字節數組,但我無法弄清楚如何去做。我試過

//retrievedFile is my Reader object 
char[] cbuf = new char[2048]; 
int numChars = retrievedFile.read(cbuf); 
//I've tried other character sets, too 
new String(cbuf).getBytes("UTF-8"); 

,我不敢向下轉換一個更有用的讀者,因爲我不知道是否相信這將工作或沒有。有什麼建議麼?

編輯

當我說它打印出「無意義的字符」,我的意思並不是說,它看起來像由喬恩斯基特給出的例子。這很難描述,因爲我現在不在我的機器上,但我認爲這是一個編碼問題。角色似乎有縮進和結構類似於報告的外觀。我會在週二回來後儘快嘗試這些建議(我只是一名實習生,所以我沒有爲設置遠程帳戶或任何其他事情而煩惱)。

+1

你試過了'BufferedReader'嗎?沒有理由爲什麼它不應該工作... – fge 2011-12-30 20:49:48

+0

如果'System.out.print(cbuf [i])'給你i = 0,1,2 ......的垃圾,那麼其他公司的lib有問題,或者你沒有配置好。 – 2011-12-30 21:02:05

回答

14

試試這個:

BufferedReader in = new BufferedReader(retrievedFile); 
String line = null; 
StringBuilder rslt = new StringBuilder(); 
while ((line = in.readLine()) != null) { 
    rslt.append(line); 
} 
System.out.println(rslt.toString()); 

不要強制轉換讀者的任何類,因爲你不知道真正的類型吧。 而是使用BufferedReader並將Reader傳入。並且BufferedReader將java.io.Reader的任何子類作爲參數,因此使用它是保存的。

+0

在我的方案中完美工作。 – 2013-05-22 10:25:48

0

由於文件是一個文本文件,請從Reader中創建一個BufferedReader並逐行閱讀 - 這應該有助於更好地理解它。

1

它給了什麼無意義的字符。可能爲空字符,因爲你沒有閱讀所有來自讀者的字符,但最多2048個字符,並且你忽略了讀取方法的返回值(告訴你實際讀取了多少個字符)。要閱讀整個事情變成一個字符串,你必須循環,直到返回的值是負的,並且在每次迭代(從0到numChars個)讀取字符追加到一個StringBuilder。

StringBuilder builder = new StringBuilder(); 
int numChars; 
while ((numChars = reader.read(cbuf)) >= 0) { 
    builder.append(cbuf, 0, numChars); 
} 
String s = builder.toString(); 
+0

示例缺少'cbuf'數組的定義。這是IMO最有效的解決方案。 – 2014-08-28 02:38:57

4

打印出來char[]本身可能會給你類似的東西:

[[email protected] 

這只是在Java中的char數組上調用toString的正常輸出。這聽起來像你想將它轉換爲String,你可以用String(char[])構造函數來完成。下面是一些示例代碼:

public class Test { 
    public static void main(String[] args) { 
     char[] chars = "hello".toCharArray(); 
     System.out.println((Object) chars); 

     String text = new String(chars); 
     System.out.println(text); 
    } 
} 

在另一方面,java.io.Readerread方法返回一個char[] - 方法,其無論是在同一時間返回單個字符,或者(更有效)接受 a char[]填寫數據,並返回讀取的數據量。這實際上是你的示例代碼顯示的內容。您只需使用char數組和讀取的字符數即可創建新的String。例如:

char[] buffer = new char[4096]; 
int charsRead = reader.read(buffer); 
String text = new String(buffer, 0, charsRead); 

但是,請注意,它可能不會一次返回所有數據。您可以使用BufferedReader逐行讀取它,或循環獲取所有信息。 Guava在其CharStreams類中包含有用的代碼。例如:

String allText = CharStreams.toString(reader); 

List<String> lines = CharStreams.readLines(reader); 
+0

喬恩,我的方法的錯誤,我忘了它返回一個int並採取一個char []。打印出char數組看起來像是一個編碼問題。它可能甚至是公司搞砸了他們的實現,或者我錯誤地配置了它,la @ amadeus的帖子 – Tom 2011-12-30 23:04:35

+0

@Tom:如果這是一個編碼問題,那可能只是因爲實現是混亂的 - 如果給出一個'Reader',你根本不需要照顧編碼*。你能提供圖書館的任何細節嗎? – 2011-12-30 23:35:22

相關問題