2014-03-01 88 views
0

我试图从安全的HTTP服务器下载JAR文件。我可以无误地下载文件,但是当我尝试运行jar文件时,Windows会报告无效或损坏的文件。由于没有错误,我无法确定问题出在哪里,但我认为这是HTTPS服务器。我知道有数据丢失,因为文件应该是3.8MB,但是当我完成下载时,它只有27KB。Java HTTPS文件下载?

下载方法是:

编辑:带环新代码插入,但它仍然只给了我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

从大约2003年开始,您就不需要为JSSE设置'java.net.protocol.handler.pkgs',或者添加提供程序。在移动中,我认为您正处于反对HTTP缓存的位置。 – EJP

+0

谢谢,但它仍然没有帮助我的问题。我可以说这个问题出现在while循环的某个地方,但不管我多少遍了它,一切看起来都是正确的。我已经无数次地检查了oracle文档页面,但仍然没有任何帮助。 – EternalCode0

+0

这就是为什么我说我认为你在某处反对HTTP缓存,而不是在你的代码中存在问题。 – EJP

回答

0

FileChannel.transferFrom的Javadoc这样说:

试图读取了从源通道数字节,并将其写入到此通道的文件从给定的位置这样的一个调用。方法可能会或可能不会传输所有请求的字节,不管它是否依赖于通道的性质和状态。如果源通道剩余的计数字节数少于请求的字节数,或者如果源信道是非阻塞的并有少于计数其输入缓冲器立即可用的字节。

在这种情况下,源信道非阻塞信道,因此,transferFrom方法不能保证整个内容一气呵成转移。

由于@EJP说,你需要把transferFrom呼叫进入一个循环,等等。

但我认为你最好直接使用InputStreamOutputStream API,在循环中读取和写入byte[] ...。

0

您需要在循环中调用transferFrom()。不保证执行整个传输。它的返回值告诉你它传输了多少字节。