问题描述
|
尝试使用apache httpclient库下载文件,结果文件小于原始文件的问题(正常文件大小为92-93时约为32-32kb),并且无法在pdf查看器中正常打开。
有人可以解释一下为什么会这样吗? (使用firefox下载此文件有时会导致文件被完全下载,有时会被部分下载)
这是我用来通过URL下载文件的代码
URL url = new URL(\"pathtofile\");
final URLConnection connection = url.openConnection();
final InputStream is = connection.getInputStream();
FileOutputStream fos = new FileOutputStream(\"C://result1.pdf\");
byte buffer[] = new byte[1024];
int bytesRead;
while ((bytesRead = is.read(buffer)) >= 0) {
fos.write(buffer,bytesRead);
}
fos.flush();
fos.close();
is.close();
附言试图使用HttpClient apache库下载此文件,结果相同。
更新:使用网络工具监视流量我发现通过Firefox和应用程序接收文件之间的区别。
在Firefox中,第一个HttpPayloadLine是:
HTTPPayloadLine: 83 Td
/F2 5.80476 Tf
(A:\\040Asinis\\04017.12.10\\04008:32\\040laboratorij) Tj
100 Tz
1 1 1 rg
/F1 5.80476 Tf
0 0 0 rg
104.4856 0 Td
<0145> Tj
1 1 1 rg
0 0 0 rg
3.62799 0.72565 Td
/F2 5.80476 Tf
(\\040) Tj
1 1 1 rg
0.83137 0.81569 0.78431 RG
ET
51
首先使用应用程序HttpPayload是
ci2ѭµï½ci
¤ðð\'È/CÈAø¯ªÍübA«1Ãÿ Åç«VɬZòYóóy7»ÇH.o²e<qZna3l±°¥þ6ñþ[2YÚ1ì³Eë-ÓÊÏ$y:tÎà![ËÅS¤¿É¡¢è,þ|ºs¨)@¢Qâ¯ÝF~}oµÒ>¦ OAxz³äÒ.ß9
æÃZ¤ùÒ¨*«øUή+4×
此测量是通过Microsoft网络监视器进行的
最后更新毕竟是服务器问题,在他们修复文件下载成功之后
解决方法
尝试更改为
while ((bytesRead = in.read(buffer)) != -1) {
byte[] tmp = ArrayUtils.subarray(buffer,bytesRead);
fos.write(tmp);
}
螨返回0字节,但这并不意味着它完成了。还只写收到的没有缓冲的字节。
, 我发现的第一件事是检查whether5ѭ是否错误,因为即使没有到达文件末尾,它也可能(至少在理论上)返回0。到达EOF时6ѭ将返回return7ѭ,因此进行比较comparison8ѭ。
编辑:
我发现的第二件事(有点晚了,因为已经在其他答案中注意到了)是您正在将整个缓冲区写入输出流,而不管它中的多少实际上受到最新读取的影响操作。尝试类似的东西:
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead;
while ( (bytesRead = in.read(buffer)) >= 0 ) {
out.write(buffer,bytesRead);
}
, 也许阅读错误流可以为您提供一些信息:
connection.getErrorStream();
, 可以改用org.apache.commons.io.FileUtils.copyURLToFile(URL,File)
吗?