我正在研究java下载程序,它从远程服务器提取文件并将其保存在本地。
以下是我使用的代码:
try {
BufferedInputStream in = new java.io.BufferedInputStream(new URL(link).openStream());
FileOutputStream fos = new FileOutputStream(destination);
BufferedOutputStream bout = new BufferedOutputStream(fos,1024);
byte data[] = new byte[1024];
int count;
while( (count = in.read(data,0,1024)) != -1){
bout.write(data,0,count);
}
fos.flush();
fos.close();
fos.close();
} catch(Throwable t){
t.printStackTrace();
}
我注意到的第一件事,服务器上的文件和下载的文件大小不完全相同 - > http://puu.sh/jGpEj/abbe832796.png(下载的文件小几个字节)。请注意,“磁盘上的大小”似乎相同。
接下来我注意到了,如果我尝试运行由java“管理员”下载的.exe,它会说“Publisher:Unknown”,这是不正确的,因为.exe是经过数字签名的。 “数字签名”标签都不存在。
有什么问题可以解决?
P.S我用Hex编辑器打开了两个文件......他们似乎都有相同的内容,除了java下载的文件丢失了最后94个字节。
答案 0 :(得分:0)
您正在写BufferedOutputStream
,但您正在刷新其中一个下游流。换句话说,您在错误的信息流上调用flush()
。
代替BufferedOutputStream bout
:
try {
BufferedInputStream in = new java.io.BufferedInputStream(new URL(link).openStream());
FileOutputStream fos = new FileOutputStream(destination);
BufferedOutputStream bout = new BufferedOutputStream(fos,1024);
byte data[] = new byte[1024];
int count;
while( (count = in.read(data,0,1024)) != -1){
bout.write(data,0,count);
}
bout.flush();
bout.close();
in.close();
} catch(Throwable t){
t.printStackTrace();
}
您还应该close
BufferedOutputStream
,它会自动传播关闭的基础流。换句话说,您不能直接关闭FileOutputStream
。
最后,实际上无需在flush()
之前致电close()
,因为close()
无论如何都会自动执行flush()
。
顺便说一句,如果你使用try-with-resources块,你可以让编译器为你插入关闭。