当前位置: 首页 > 面试题库 >

Java取得下载进度

孔鸿云
2023-03-14
问题内容

我正在编写一个Java应用程序(将NetBeans用作IDE和jFrame表单),并且其中一部分下载了文件。如何使用下载的当前进度更新进度条,或者至少获取另一个线程中当前下载的字节总数?

以下是我的代码的一部分:

Runnable updatethread = new Runnable() {
        public void run() {
            try {
                java.io.BufferedInputStream in = new java.io.BufferedInputStream(new java.net.URL("server/package.zip").openStream());
                java.io.FileOutputStream fos = new java.io.FileOutputStream("package.zip");
                java.io.BufferedOutputStream bout = new BufferedOutputStream(fos,1024);
                byte[] data = new byte[1024];
                int x=0;
                while((x=in.read(data,0,1024))>=0)
                {
                    bout.write(data,0,x);
                }
                bout.close();
                in.close();
            }
            catch(FileNotFoundException e) { } catch (IOException e) { }
        }
    };
new Thread(updatethread).

start();
try {
    updatethread.wait();

} catch (InterruptedException ex) { }

问题答案:

一个工作示例,使用您的代码并在进度栏中显示进度,如下所示:

import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;

import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;

public class Progressbar {

    public static void main(String[] args) {

        final JProgressBar jProgressBar = new JProgressBar();
        jProgressBar.setMaximum(100000);
        JFrame frame = new JFrame();
        frame.setContentPane(jProgressBar);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(300, 70);
        frame.setVisible(true);

        Runnable updatethread = new Runnable() {
            public void run() {
                try {

                    URL url = new URL("http://downloads.sourceforge.net/project/bitcoin/Bitcoin/blockchain/bitcoin_blockchain_170000.zip");
                    HttpURLConnection httpConnection = (HttpURLConnection) (url.openConnection());
                    long completeFileSize = httpConnection.getContentLength();

                    java.io.BufferedInputStream in = new java.io.BufferedInputStream(httpConnection.getInputStream());
                    java.io.FileOutputStream fos = new java.io.FileOutputStream(
                            "package.zip");
                    java.io.BufferedOutputStream bout = new BufferedOutputStream(
                            fos, 1024);
                    byte[] data = new byte[1024];
                    long downloadedFileSize = 0;
                    int x = 0;
                    while ((x = in.read(data, 0, 1024)) >= 0) {
                        downloadedFileSize += x;

                        // calculate progress
                        final int currentProgress = (int) ((((double)downloadedFileSize) / ((double)completeFileSize)) * 100000d);

                        // update progress bar
                        SwingUtilities.invokeLater(new Runnable() {

                            @Override
                            public void run() {
                                jProgressBar.setValue(currentProgress);
                            }
                        });

                        bout.write(data, 0, x);
                    }
                    bout.close();
                    in.close();
                } catch (FileNotFoundException e) {
                } catch (IOException e) {
                }
            }
        };
        new Thread(updatethread).

        start();
    }

}

这显示了如何做-在使用它之前,您应该考虑GUI-Threads等。



 类似资料:
  • 我正在编写一个Java应用程序(使用NetBeans作为IDE和jFrame表单),其中一部分下载一个文件。我如何用下载的当前进度更新进度条,或者至少获得另一个线程中当前下载的字节总量? 下面是我的一部分代码:

  • fetch 方法允许去跟踪 下载 进度。 请注意:到目前为止,fetch 方法无法跟踪 上传 进度。对于这个目的,请使用 XMLHttpRequest,我们在后面章节会讲到。 要跟踪下载进度,我们可以使用 response.body 属性。它是 ReadableStream —— 一个特殊的对象,它可以逐块(chunk)提供 body。在 Streams API 规范中有对 ReadableStr

  • 问题内容: 我正在创建一个更新程序,该更新程序使用Node模块下载应用程序文件。如何估算剩余文件大小?这是我的代码的一部分: 问题答案: 这应该为您提供所需的总数: 我得到的内容长度为

  • 问题内容: 我想获取我的AJAX请求的进度-到目前为止已下载了多少文件。例如,我正在使用AJAX下载大图片,因此可以将内容放在DATA URL中(这可能不是最好的方法,这只是一个示例。) 因此,我向无法控制的某些主机发出了AJAX请求(flickr),并将进度报告给用户。如果没有服务器端脚本或类似的东西,我找不到解决方法。最好的解决方案是使用JQuery,因为那是我在网站上使用的。谢谢!以撒 问题

  • 问题内容: 我对cURL很陌生,所以我已经为这个问题苦苦挣扎了好几个小时。我正在尝试使用cURL在iframe中下载网站的源代码,并在加载时显示其中已加载了多少。到目前为止,我已经成功下载了源代码,但未显示加载进度。您能解释一下如何显示下载进度吗?如果没有cURL,我将逐字节读取文件,然后将下载的字节总数除以文件的总大小。由于cURL会整体读取源代码,因此该如何在cURL中完成?(至少我认为这是唯

  • 我向服务器发出POST请求以生成CSV文件,POST请求的响应是我要写入文件的CSV数据。 我永远不知道CSV文件的大小(它可以是10MB,100MB或1000MB),因此没有内容长度的头。 我已经编写了一个函数,可以下载并向服务器发出POST请求,生成CSV文件并将响应写入CSV文件。然而,我正在努力与进步吧。 如何添加进度条?