我正在尝试从安全的HTTP服务器下载JAR文件。我可以无错误地下载文件,但是当我尝试运行jar文件时,Windows会报告无效或损坏的文件。因为没有错误我无法分辨问题所在,我认为这是因为它是一个HTTPS服务器。我知道有数据丢失,因为文件应该是3.8MB但是当我下载完毕时它只有27KB。
下载方法是:
编辑:插入循环的新代码,但它仍然只给我27KB文件。
public static boolean downloadFile(String fileLocation, String urlLocation) {
try {
System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
int i;
URL url = new URL(urlLocation);
URLConnection conn= url.openConnection();
File f = new File(fileLocation);
BufferedInputStream bis = new BufferedInputStream(conn.getInputStream());
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(f.getName()));
while ((i = bis.read()) != -1) {
bos.write(i);
}
bos.flush();
bos.close();
return true;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
答案 0 :(得分:0)
您需要在循环中调用transferFrom()。它不能保证执行整个传输。它的返回值告诉你它传输了多少字节。
答案 1 :(得分:0)
FileChannel.transferFrom
的javadoc说:
“尝试从源通道读取计数字节,并将它们从给定位置开始写入此通道的文件。调用此方法可能会也可能不会传输所有请求的字节;它是否这样做取决于通道的性质和状态。如果源通道剩余的字节数少于计数字节,或者如果源通道是非阻塞且少于计数在其输入缓冲区中立即可用的字节。“
在这种情况下,源频道 是一个非阻塞频道,因此无法保证transferFrom
方法一次性传输整个内容。
正如@EJP所说,你需要将transferFrom
调用放入一个循环,等等。
但我认为您最好直接使用InputStream
和OutputStream
API,在循环中读取和写出byte[]
....