6

私はソフトウェアにファイルをダウンロードする作業をしています。これは私が得たものであり、正常にダウンロードされ、また進歩を遂げることができますが、それでも方法がわからないことが1つ残っています。ダウンロード速度を測定します。よろしくお願いします。ありがとう。これは現在のダウンロード方法コードです

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

3 に答える 3

9

何でも測定するのと同じ方法です。

System.nanoTime()Long何かにかかる時間を測定するために使用できるa を返します。

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

これで、X バイトを読み取るのにかかったナノ秒数がわかりました。計算すると、ダウンロード率がわかります。

おそらく、1 秒あたりのバイト数を探しているでしょう。読み取った合計バイト数を追跡​​し、1 秒が経過したかどうかを確認します。1 秒経過したら、その時間内に読み取ったバイト数に基づいて速度を計算します。合計をリセットし、繰り返します。

于 2011-06-12T15:35:11.967 に答える
2

ここに私の実装があります

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);
        }
于 2013-11-19T08:51:18.020 に答える
1

私はあなたに一般的な考えを与えることができます。ダウンロードの開始時にタイマーを開始します。に を掛け、(percentage downloaded)download size割ると、time elapsed.平均ダウンロード時間が得られます。あなたが正しい軌道に乗ってくれることを願っています!

System.nanoTime();ブライアンの提案どおりに使用できます。

long startTime = System.nanoTime();while ループの外に置きます。と

long estimatedTime = System.nanoTime() - startTime;ループ内の経過時間を示します。

于 2011-06-12T15:35:00.657 に答える