2013-03-14 38 views
1

下面的代碼使用的BufferedReader從HTTP響應流,讀:如何將文本HTTP響應完全按原樣讀入字符串?

final StringBuilder responseBuilder = new StringBuilder(); 
String line = bufferedReader.readLine(); 
while (line != null) { 
    responseBuilder.append(line); 
    responseBuilder.append('\n'); 
    line = bufferedReader.readLine(); 
} 
response = responseBuilder.toString(); 

但追加'\n'於每行似乎有點缺陷。我想完全按原樣返回HTTP響應,那麼如果在最後一行之後沒有返回字符呢?無論如何,使用上面的代碼將會添加 - 是否有更好的方法?

+0

我相信你會得到html「文本」?是對的嗎?你是否想以「人類」可讀形式添加'\ n'?因爲即使沒有換行符,任何解析器都應該處理響應 – Najzero 2013-03-14 10:27:57

+0

是的,內容類型是「text/xml」。爲了系統的目的,它並不需要人爲可讀,但它被記錄到日誌文件中,因此需要這樣做。 – 2013-03-14 10:31:22

+0

好,那麼我建議通過一個「漂亮的打印」庫(也照顧身份證)運行它。我認爲http://sourceforge.net/projects/jtidy/會很漂亮。只需將整個響應砸碎並請求相當的打印輸出 – Najzero 2013-03-14 10:35:19

回答

3

我想正好返回HTTP響應,-是

不要使用readLine()然後 - 就這麼簡單。我建議使用一個StringWriter代替:

StringWriter writer = new StringWriter(); 
char[] buffer = new char[8192]; 
int charsRead; 
while ((charsRead = bufferedReader.read(buffer)) > 0) { 
    writer.write(buffer, 0, charsRead); 
} 
response = writer.toString(); 

注意,即使是這樣,如果你得到的編碼錯誤將無法正常工作。要保留確切的 HTTP響應,您需要讀取(並寫入)它作爲二進制流。

+0

要保留確切的HTTP響應,您需要讀取字節,而不調解「Reader」,並且還需要了解Content-Length問題。 – EJP 2013-03-14 10:32:20

+0

@EJP - 我遇到了一個內容長度問題,在前面的問題中提出:http://stackoverflow.com/questions/14817310/java-how-to-prevent-eofexception-for-an-empty-http-迴應這是你指的同一個問題嗎? – 2013-03-14 10:41:36

+0

@EJP:同意事物的二進制方面 - 請參閱我的答案的結尾。對於內容的長度,我希望*讀者已經做了正確的事情。 – 2013-03-14 10:43:38

相關問題