Вопрос

Я работаю над загрузкой файла на программном обеспечении, это то, что я получил, он успешно загружаю, а также я могу получить прогресс, но все же осталась одна вещь, которую я не знаю, как это сделать. Измерьте скорость загрузки. Я был бы признателен за вашу помощь. Спасибо. Это текущий код метода загрузки

    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);
            }
        }
    }
Это было полезно?

Решение

Точно так же вы бы измеряли что -нибудь.

System.nanoTime() Возвращает а Long Вы можете использовать, чтобы измерить, сколько времени что -то займет:

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

Теперь у вас есть количество наносекунд, которые потребовались для чтения x байтов. Сделайте математику, и вы получите свой уровень загрузки.

Скорее всего, вы ищете байты в секунду. Следите за общим количеством байтов, которые вы прочитали, проверяя, прошел ли одна секунда. Однажды одна секунды выяснила скорость, основываясь на том, сколько байтов вы прочитали за это время. Сбросить общее, повторить.

Другие советы

Вот моя реализация

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

Я могу дать вам общую идею. Начните таймер в начале загрузки. Теперь умножьте (percentage downloaded) посредством download size, и разделяйте его на time elapsed. Это дает вам среднее время загрузки. Надеюсь, я приведу тебя на правильном пути!

Вы можете использовать System.nanoTime(); Как предполагает Брайан.

Помещать long startTime = System.nanoTime(); За пределами вашей петли. а также

long estimatedTime = System.nanoTime() - startTime; Даст вам прошедшее время в вашей петле.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top