2012-06-25 58 views
2

我試圖編寫一個程序,它以分塊格式從Web服務器獲取文件。我想在HTTP 3.0 API中使用ChunkedInputStream類。當我運行代碼時,它給了我「意外終止的輸入流」錯誤。我究竟做錯了什麼?這裏是我的代碼:分塊輸入流意外結束

HttpClient client = new DefaultHttpClient(); 
    HttpGet getRequest = new HttpGet(location); 
    HttpResponse response = client.execute(getRequest); 
    InputStream in = response.getEntity().getContent(); 

    ChunkedInputStream cis = new ChunkedInputStream(in); 
    FileOutputStream fos = new FileOutputStream(new ile("session_"+sessionID)); 
    while(cis.read() != -1) 
    { 
     fos.write(cis.read()); 
    } 
    in.close(); 
    cis.close(); 
    fos.close(); 
+0

我有可能是一個類似的問題,並沒有完全下載提取的網頁。我想知道PHP CURL庫可能比這更好嗎? http://www.php.net/manual/en/intro.curl.php – NoBugs

回答

2

不要使用ChunkedInputStream,正如axtavt所示,但還有另一個問題。您正在跳過每個奇數字節。如果數據是偶數個字節,則您將寫入-1表示EOS,然後再進行另一次讀取。正確的方法來複制一個流:

byte[] buffer = new byte[8192]; 
int count; 
while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 
+0

非常感謝!我現在得到正確大小的文件!我的另一個問題是如何保留隨每個數據塊發送的標籤? – user1480813

1

您確定在這種情況下需要使用ChunkedInputStream嗎?

我認爲HttpClient應該在內部處理chuncked編碼,因此response.getEntity().getContent()返回已經解碼的流。

+0

通過只使用輸入流,現在我確實得到了文件的內容。該文件最重要的部分是遍佈整個內容的標籤。有什麼方法可以保留文件內容行之間的標籤?如果我做wireshark,我會看到標籤,但我下載的文件沒有。 – user1480813

+0

@ user1480813:你的意思是你需要明確界定塊界限?這是一個奇怪的要求,我不認爲它可以在這個抽象層次上完成。要做到這一點,您需要以某種方式介入Http Client的響應處理邏輯,或者直接使用套接字。 – axtavt