【问题标题】:Chunked input stream ended unexpectedly分块输入流意外结束
【发布时间】:2012-06-25 18:46:59
【问题描述】:

我试图编写一个程序,以分块格式从 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();

【问题讨论】:

标签: java httpclient chunked


【解决方案1】:

不要像 axtavt 建议的那样使用 ChunkedInputStream,但还有另一个问题。您正在跳过每个奇数字节。如果数据是偶数字节,您将写入表示 EOS 的 -1,然后再进行一次读取。复制流的正确方法:

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

【讨论】:

  • 非常感谢!我现在得到正确大小的文件!我的另一个问题是如何保留与每个数据块一起发送的标签?
【解决方案2】:

您确定在这种情况下需要使用ChunkedInputStream 吗?

我认为HttpClient 应该在内部处理分块编码,因此response.getEntity().getContent() 返回已经解码的流。

【讨论】:

  • 只使用输入流,现在我确实得到了文件的内容。文件中最重要的部分是分布在整个内容中的标签。有什么方法可以保留文件内容行之间的标签吗?如果我使用wireshark,我会看到标签,但我下载的文件没有标签。
  • @user1480813:你的意思是你需要明确地获得块边界?这是一个奇怪的要求,我不认为它可以在这个抽象级别上完成。为此,您需要以某种方式干预 Http Client 的响应处理逻辑,或者直接使用套接字。
猜你喜欢
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-22
相关资源
最近更新 更多