2013-05-23 2 views
0

Existe-t-il un moyen de voir la vitesse de transfert (Mo/s) lors de la copie de fichiers? Ce n'est pas pour les sockets réseau mais pour hdd en hdd par exemple. Je copie le contenu des fichiers en octets. Code pour la copie de fichiers: la plate-forme est WindowsVitesse de transfert physique Java IO

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

Un exemple de la façon dont cela peut être fait? Cordialement

+0

Quel code utilisez-vous pour copier les fichiers? Si vous le faites dans une simple boucle, alors c'est trivial, vous mesurez juste combien d'octets vous avez reçu dans le temps depuis que vous avez commencé le transfert. Si vous utilisez des canaux/NIO, alors cela devient un peu plus compliqué, mais cela peut toujours être fait si vous initiez le transfert en morceaux plutôt qu'en une seule fois. – berry120

+0

Enveloppez le code de la copie avec le code pour vérifier l'heure. Comparez les données transférées chaque seconde. –

+0

Vous semblez rechercher 'hdparm'. Vous n'avez pas spécifié la plate-forme, cela fonctionnera sous Linux. – devnull

Répondre

4

Une sorte de. D'abord, vous pouvez le faire au niveau de l'application. Votre code fichier copie doit ressembler à:

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

Ainsi, le modifier comme suit:

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

Vous pouvez faire mieux. Implémentez SpeedMeasurementOutputStream qui enveloppe tout flux de sortie et exécute une logique similaire dans sa méthode write(). Puis enveloppez FileOutputStream en utilisant ce flux et obtenez la vitesse tout en copiant. Cette approche est préférable car vous pouvez ainsi mesurer la vitesse de n'importe quel flux.

+0

Si j'utilise votre exemple, j'obtiens java.lang.ArithmeticException:/par zéro – user1794974

+0

@ user1794974 Le code montre seulement le principe. Traiter les cas de bords comme zéro millisecondes écoulées dans la formule est * votre * travail. – Durandal