2011-06-12 76 views
6

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

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); 
      } 
     } 
    } 

回答

8

与测量任何东西一样。

System.nanoTime()返回Long你可以用它来衡量的东西需要多长时间:

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

现在你拥有了它花时间阅读X字节纳秒数。做数学,你有你的下载率。

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

+0

你能否在这里写出修改后的代码?谢谢 – 2011-06-12 15:44:26

+0

将InputStream.read()'转换为KB-MB-GB/s的时间的公式?答案有助于衡量'InputStream.read()'的执行时间。 – 2017-06-24 18:36:23

1

我可以给你一个总体思路。在下载开始时启动计时器。现在,将(percentage downloaded)乘以download size,再除以time elapsed.即可得到平均下载时间。希望我能帮助你走上正轨!

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

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

long estimatedTime = System.nanoTime() - startTime;会给你循环内的经过时间。

+1

我不知道如何添加它,我对获得进步的计时器,但放久了GUI – 2011-06-12 15:43:28

+0

** STARTTIME = System.nanoTime(); **外你的while循环。和long ** estimatedTime = System.nanoTime() - startTime; **会给你当前时间 – 2011-06-12 15:47:38

+0

是这样尝试的'long startTime = System.nanoTime();',while while和'Long end = System.currentTimeMillis ()* 1000;',在缓冲区写入后,但似乎只能工作一次?,还加入了这个速度=(int)((1024 /(double)(start-end)));',因为缓冲区有1024字节 – 2011-06-12 15:51:49

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); 
     }