Java URLConnection没有收到整个二进制文件

时间:2011-03-21 13:25:40

标签: java http binary httpurlconnection urlconnection

我目前正在开设一所学校,其中包括为我们在课堂上提出的标准创建P2P客户端,该标准使用HTTP从同行请求块的二进制文件。我们被允许使用Java的HTTP库来发出这些请求,但是我遇到了这些库的一个主要问题。文件的所有块都将以<= 64KB的块提供,但是当我使用以下代码时,即使响应的内容长度为64KB,我收到的最大字节数也大约为15040: / p>

String response = "";

URL url = new URL(uriPath);
URLConnection conn = url.openConnection ();

conn.setConnectTimeout(30 * 1000);
conn.setReadTimeout(30 * 1000);

InputStream stream = conn.getInputStream();
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();

int c;
byte[] buffer = new byte[4096];

while ((c = stream.read(buffer)) != -1)
{
    byteArrayOut.write(buffer,0,c);
}

body = byteArrayOut.toByteArray();


stream.close();
result.put(Constants.HEADER_CONTENT_LENGTH, conn.getHeaderField(Constants.HEADER_CONTENT_LENGTH));
result.put(Constants.HEADER_CONTENT_CHECKSUM, conn.getHeaderField(Constants.HEADER_CONTENT_CHECKSUM));
result.put(Constants.KEY_BODY, new String(body));

我们已经测试了我们的服务器组件,并且在使用wget或浏览器访问块时正确地提供了文件 - 这个java客户端是我们能够找到的唯一有问题的客户端。

这是Java的URLConnection类的问题,还是我的代码中有些东西在读取响应中返回的二进制文件时出错?

注意:我在Eclipse和命令行中使用Java 1.6。

1 个答案:

答案 0 :(得分:1)

你怎么知道最大字节数是15040?你有byteArrayOut.toByteArray()。length还是你做了新的String(byteArrayOut.toByteArray())。length()?

从具有二进制内容的字节数组创建新String可能会产生不可预测的结果。使用FileOutputStream并打开该文件。