Domanda

sto lavorando su download di un file su un software, questo è quello che ho ottenuto, è sucesfully scaricare, e anche io posso ottenere progressi, ma ancora 1 cosa di sinistra che non so come fare. Misurare la velocità di download. Gradirei il vostro aiuto. Grazie. Questo è il codice metodo di download corrente

    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);
            }
        }
    }
È stato utile?

Soluzione

Lo stesso modo si dovrebbe misurare il nulla.

System.nanoTime() restituisce un Long è possibile utilizzare per misurare quanto tempo qualcosa prende:

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

Ora avete il numero di nanosecondi ci sono voluti per leggere X byte. Fare la matematica e hai il tuo velocità di download.

Molto probabilmente siete alla ricerca di byte al secondo. Tenere traccia del numero totale di byte che hai letto, controllo per vedere se uno secondo è trascorso. Una volta che uno secondo è passato dal capire il tasso di base a quanti byte che hai letto in quel lasso di tempo. Azzerare il totale, di ripetizione.

Altri suggerimenti

ecco la mia implementazione

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

posso darvi un'idea generale. Avviare un timer all'inizio del download. Ora, moltiplicare il (percentage downloaded) dal download size, e dividerlo per il time elapsed. Che ti dà il tempo medio di download. Spero che vi ho sulla strada giusta!

È possibile utilizzare System.nanoTime(); come suggerito da Brian.

long startTime = System.nanoTime(); Mettere fuori del vostro ciclo while. e

long estimatedTime = System.nanoTime() - startTime; vi darà il tempo trascorso all'interno del tuo ciclo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top