2011-06-12 16 views
6

Estoy trabajando en la descarga de un archivo en un software, esto es lo que obtuve, lo descargué con éxito, y también puedo progresar, pero me queda 1 cosa que no sé cómo hacer. Mida la velocidad de descarga. Apreciaría tu ayuda. Gracias. Este es el vigente código método de descargaMedición Descargar Speed ​​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); 
      } 
     } 
    } 

Respuesta

8

De la misma forma en que medirías cualquier cosa.

System.nanoTime() devuelve una Long puede utilizar para medir el tiempo que tarda algo:

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

Ahora usted tiene el número de nanosegundos que se tardó en leer X bytes. Haz los cálculos y tienes tu tasa de descarga.

Es muy probable que esté buscando bytes por segundo. Mantenga un registro de la cantidad total de bytes que ha leído, verificando si ha transcurrido un segundo. Una vez que ha transcurrido un segundo, calcule la tasa según la cantidad de bytes que haya leído en esa cantidad de tiempo. Restablece el total, repite.

+0

¿Podría escribir el código modded aquí? gracias –

+0

la fórmula para convertir el tiempo que 'InputStream.read()' a KB-MB-GB/s? Las respuestas ayudan a medir el tiempo de ejecución de 'InputStream.read()'. –

1

Te puedo dar una idea general. Comience un temporizador al comienzo de la descarga. Ahora, multiplique el (percentage downloaded) por el download size, y divídalo por el time elapsed. Eso le da tiempo de descarga promedio. Espero que te lleve por el buen camino!

Puede usar System.nanoTime(); según lo sugerido por Brian.

Ponga long startTime = System.nanoTime(); fuera de su ciclo while. y

long estimatedTime = System.nanoTime() - startTime; le dará el tiempo transcurrido dentro de su ciclo.

+1

No sé cómo añadir que, tengo un contador de tiempo para conseguir el progreso, pero en la interfaz gráfica de usuario –

+0

Ponga larga ** = horaInicio System.nanoTime(); ** fuera su ciclo while y long ** estimatedTime = System.nanoTime() - startTime; ** le dará la hora actual –

+0

Sí intentado así 'long startTime = System.nanoTime();', while while, y 'Long end = System.currentTimeMillis() * 1000; ', dentro, después de escribir en el búfer, pero parece que solo funciona una vez ?, también agregó esto' speed = (int) ((1024/(double) (start-end))); ', porque el búfer tiene 1024 bytes –

1

aquí está mi aplicación

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