2012-06-25 72 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