1

在我有自动更新的程序中,我需要它下载一个特定的文件(已经工作),它使用以下代码:

public static void getFile() {
    try {
        URL url = new URL("https://dl.dropboxusercontent.com/s/tc301v61zt0v5cd/texture_pack.png?dl=1");
        InputStream in = new BufferedInputStream(url.openStream());
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        byte[] buf = new byte[1024];
        int n = 0;
        while (-1 != (n = in.read(buf))) {
            out.write(buf, 0, n);
        }
        out.close();
        in.close();
        byte[] response = out.toByteArray();
        FileOutputStream fos = new FileOutputStream(file4);
        fos.write(response);
        fos.close();
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "Check your internet connection, then try again.\nOr re-install the program.\nError Message 7", "Could Not Download The Required Resources.", JOptionPane.NO_OPTION);
        e.printStackTrace();
        System.exit(0);
    }
}

我将如何实现一种方法来获取当前的下载完成(例如下载的百分比)并将其放入一个整数中以在控制台中打印出来(仅用于开发人员测试)。另外,我可以使用什么样的方程来获得下载剩余的估计时间?任何事情都会有帮助!谢谢。

4

2 回答 2

4

如果您检查文件下载中发送的 HTTP 标头,您会发现文件大小。由此您可以计算完成百分比:

curl --head "https://dl.dropboxusercontent.com/s/tc301v61zt0v5cd/texture_pack.png?dl=1"

给你这个:

HTTP/1.1 200 OK
accept-ranges: bytes
cache-control: max-age=0
content-disposition: attachment; filename="texture_pack.png"
Content-length: 29187
Content-Type: image/png
Date: Mon, 28 Apr 2014 22:38:34 GMT
etag: 121936d
pragma: public
Server: nginx
x-dropbox-request-id: 1948ddaaa2df2bdf2c4a2ce3fdbeb349
X-RequestId: 4d9ce90907637e06728713be03e6815d
x-server-response-time: 514
Connection: keep-alive

但是,您可能必须使用比标准 Java 库类更高级的东西来访问标头,例如 Apache HttpClient。

于 2014-04-28T22:42:00.140 回答
2

没有流式传输到文件末尾就无法获得流式传输文件的大小,因此无法在该代码块内完成。

如果您愿意采用 Dropbox API,您可以在开始下载之前使用它来获取文件的大小。然后,您可以使用该大小和下载的字节数(n在您的代码中)来实现您所需要的。

您需要的 Dropbox API 中的类是DbxEntry.File

于 2014-04-28T22:37:47.167 回答