2013-05-23 3 views
0

Есть ли способ увидеть скорость передачи (МБ/с) при копировании файлов? Это не для сетевых сокетов, а для hdd для hdd, например. i копирует содержимое файлов в байтах. Код для копирования файлов: Платформа окнаСкорость физической передачи Java IO

while ((length = in.read(buffer)) > 0) { 
    out.write(buffer, 0, length); 
    totalBytesCopied += length; 
    int totalKilos = (int) totalBytesCopied/1024; 
    int totalMegas = totalKilos/1024; 
} 

пример того, как это можно сделать? С уважением

+0

Какой код вы используете для копирования файлов? Если вы делаете это в простом цикле, это тривиально, вы просто измеряете, сколько байтов вы получили за время, прошедшее с момента начала передачи. Если вы используете каналы/NIO, то это становится немного сложнее, но все равно можно сделать, если вы инициируете передачу в кусках, а не за все за один раз. – berry120

+0

Оберните копию кода с кодом, чтобы проверить время. Сравните данные, передаваемые каждую секунду. –

+0

Вы, кажется, ищете 'hdparm'. Вы не указали платформу, которая будет работать в Linux. – devnull

ответ

4

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

byte[] buffer = new byte[BUFFER_SIZE]; 
    int n = 0; 
    while (-1 != (n = input.read(buffer))) { 
     output.write(buffer, 0, n); 
    } 

Таким образом, изменить его следующим образом:

byte[] buffer = new byte[BUFFER_SIZE]; 
    int n = 0; 
    long before = System.currentTimeMillis(); 
    while (-1 != (n = input.read(buffer))) { 
     output.write(buffer, 0, n); 
     long after = System.currentTimeMillis(); 
     double speed = n/(after - before) * 1000; // speed in byte per second 
     before = System.currentTimeMillis(); 
    } 

Вы можете сделать лучше. Внесите SpeedMeasurementOutputStream, который обертывает любой выходной поток и выполняет аналогичную логику в свой метод write(). Затем оберните FileOutputStream, используя этот поток, и получите скорость при копировании. Этот подход лучше, потому что таким образом вы можете измерять скорость любого потока.

+0

Если я использую ваш пример, я получаю java.lang.ArithmeticException:/нолем – user1794974

+0

@ user1794974 Код показывает только принцип. Работа с крайними случаями, такими как нулевые миллисекунды в формуле, - это * ваша * работа. – Durandal

Смежные вопросы