【问题标题】:Measuring Download Speed Java测量 Java 下载速度
【发布时间】:2011-09-13 10:42:00
【问题描述】:

我正在下载一个软件上的文件,这就是我得到的,它成功下载了,我也可以取得进展,但还有一件事我不知道该怎么做。测量下载速度。我会很感激你的帮助。谢谢。 这是当前的下载方法代码

    public void run()
    {
        OutputStream out = null;
        URLConnection conn = null;
        InputStream in = null;
        try
        {
            URL url1 = new URL(url);
            out = new BufferedOutputStream(
            new FileOutputStream(sysDir+"\\"+where));
            conn = url1.openConnection();
            in = conn.getInputStream();
            byte[] buffer = new byte[1024];
            int numRead;
            long numWritten = 0;
            double progress1;
            while ((numRead = in.read(buffer)) != -1)
            {
                out.write(buffer, 0, numRead);
                numWritten += numRead;
                this.speed= (int) (((double)
                buffer.length)/8);
                progress1 = (double) numWritten;
                this.progress=(int) progress1;
            }
        }
        catch (Exception ex)
        {
            echo("Unknown Error: " + ex);
        }
        finally
        {
            try
            {
                if (in != null)
                {
                    in.close();
                }
                if (out != null)
                {
                    out.close();
                }
            }
            catch (IOException ex)
            {
                echo("Unknown Error: " + ex);
            }
        }
    }

【问题讨论】:

    标签: java file download measure


    【解决方案1】:

    这是我的实现

    while (mStatus == DownloadStatus.DOWNLOADING) {
                /*
                 * Size buffer according to how much of the file is left to
                 * download.
                 */
                byte buffer[];
                // handled resume case.
                if ((mSize < mDownloaded ? mSize : mSize - mDownloaded <= 0 ? mSize : mSize - mDownloaded) > MAX_BUFFER_SIZE) {
                    buffer = new byte[MAX_BUFFER_SIZE];
                } else {
                    buffer = new byte[(int) (mSize - mDownloaded)];
                }
    
                // Read from server into buffer.
                int read = stream.read(buffer);
                if (read == -1)
                    break;// EOF, break while loop
    
                // Write buffer to file.
                file.write(buffer, 0, read);
                mDownloaded += read;
                double speedInKBps = 0.0D;
                try {
                    long timeInSecs = (System.currentTimeMillis() - startTime) / 1000; //converting millis to seconds as 1000m in 1 second
                    speedInKBps = (mDownloaded / timeInSecs) / 1024D;
                } catch (ArithmeticException ae) {
    
                }
                this.mListener.publishProgress(this.getProgress(), this.getTotalSize(), speedInKBps);
            }
    

    【讨论】:

      【解决方案2】:

      我可以给你一个大概的想法。在下载开始时启动计时器。现在,将(percentage downloaded) 乘以download size,再除以time elapsed.,这样就可以得出平均下载时间。希望我能让你走上正轨!

      您可以按照 Brian 的建议使用 System.nanoTime();

      long startTime = System.nanoTime(); 放在您的while 循环之外。和

      long estimatedTime = System.nanoTime() - startTime; 将为您提供循环中经过的时间。

      【讨论】:

      • 我不知道如何添加它,我有一个获取进度的计时器,但在 GUI 上
      • 把 long startTime = System.nanoTime(); 放在你的 while 循环之外。和 long estimatedTime = System.nanoTime() - startTime; 会给你当前时间
      • 是的,像这样尝试过long startTime = System.nanoTime();,外部while,和Long end = System.currentTimeMillis()*1000;,内部,缓冲区写入后,但似乎只工作一次?,还添加了这个speed= (int) ((1024/(double) (start-end)));,因为缓冲区有1024字节
      • @JesusDavidGulfoAgudelo,嘿,我也在找同样的东西。按照您在上面的评论中指定的操作后,您的代码是否正常工作。
      【解决方案3】:

      测量任何东西的方法都是一样的。

      System.nanoTime() 返回一个Long,您可以使用它来衡量某件事需要多长时间:

      Long start = System.nanoTime();
      // do your read
      Long end = System.nanoTime();
      

      现在您有了读取 X 个字节所需的纳秒数。算一算,你就有了下载速度。

      您很可能正在寻找每秒字节数。跟踪您已读取的字节总数,检查是否已经过了一秒钟。一秒钟过去后,根据您在这段时间内读取的字节数计算出速率。重置总数,重复。

      【讨论】:

      • InputStream.read()的时间转换为KB-MB-GB/s的公式?答案有助于衡量InputStream.read()的执行时间。
      猜你喜欢
      • 2012-08-28
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 2011-03-27
      相关资源
      最近更新 更多