尝试使用apache httpclient库下载文件,并且导致文件小于原始文件(大约32-32kb,正常文件大小为92-93)时出现问题,并且无法在pdf查看器中正常打开。 有人可以解释一下为什么会发生这种情况吗? (使用firefox下载此文件有时会导致文件被完全下载,有时会被部分下载)
以下是我用来通过网址下载文件的代码
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, 0, bytesRead);
}
fos.flush();
fos.close();
is.close();
P.S。试图使用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
HTTPPayloadLine: CWgC,ú&ÿ3@Î"ݯV¨®~×>×)\ªleÚl
μï½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网络监视器
进行的最后更新毕竟,在修复了成功下载文件之后,服务器出现了问题
答案 0 :(得分:3)
尝试更改为
while ((bytesRead = in.read(buffer)) != -1) {
byte[] tmp = ArrayUtils.subarray(buffer, 0, bytesRead);
fos.write(tmp);
}
你的mite返回0字节,但这并不意味着它已完成。也只写你收到的不是缓冲区的字节。
答案 1 :(得分:0)
我发现的第一件事就是你检查is.read(buffer) > 0
是否错误,因为它(理论上至少)可能会返回0,即使它没有到达文件末尾。当达到EOF时,InputStream.read()
将返回-1
,因此请进行比较>= 0
。
编辑: 我发现的第二件事(有点晚了,因为它已经在其他答案中被注意到)是你将整个缓冲区写入输出流,无论它有多少实际受到最新读取操作的影响。尝试类似:
byte[] buffer = new byte[BUFFER_SIZE];
int bytesRead;
while ( (bytesRead = in.read(buffer)) >= 0 ) {
out.write(buffer, 0, bytesRead);
}
答案 2 :(得分:0)
也许阅读错误流可以为您提供一些信息:
connection.getErrorStream();
答案 3 :(得分:0)
您可以使用org.apache.commons.io.FileUtils.copyURLToFile(URL, File)
吗?