2017-06-30 3 views
1

J'essaie de copier des fichiers avec la méthode Files.copy pendant un lot. Chaque exécution prend un temps différent pour copier les fichiers. J'utilise exactement les mêmes 12 fichiers à chaque fois. Cela varie de 30 secondes à 30 minutes. Comment est-ce possible?Files.copy varie extrêmement en vitesse

public void copyFile(File sourceFile, File targetFile, CopyOption... options) throws IOException { 
    Files.copy(sourceFile.toPath(), targetFile.toPath(), options); 
} 

Comme options, j'utiliser StandardCopyOption.COPY_ATTRIBUTES.

je l'habitude d'utiliser le code proposé à http://stackoverflow.com/questions/106770/standard-concise-way-to-copy-a-file-in-java mais voulait changer depuis que je mis à niveau vers Java 7.

+2

Quel environnement, matériel, quels autres programmes peuvent utiliser le disque ...? Les possibilités sont infinies. – Kayaman

+0

Je travaille sur Windows 10 et je lance le Batch avec Eclipse (Version: Mars.2 Release (4.5.2)). Les fichiers sont déplacés d'un répertoire sur un serveur vers un autre répertoire sur le même serveur. J'ai pensé que le serveur était le problème aussi. La chose étrange est que le temps qu'il faut pour copier les fichiers est compatible avec l'ancienne méthode. – Clara

+0

J'ai vu quelques questions liées à 'Files.copy' impliquant un comportement de performance étrange, mais je ne me souviens pas des raisons racines qui ont été trouvées. Vous devriez faire quelques recherches sur SO pour ces autres questions (je recommande d'utiliser Google pour cela, car la recherche SO fonctionne souvent mal). – Kayaman

Répondre

0

vous pouvez peut-être essayer d'utiliser une autre bibliothèque?

par exemple Apache Commons:

 /** 
     * <dependency> 
     * <groupId>org.apache.commons</groupId> 
     * <artifactId>commons-io</artifactId> 
     * <version>1.3.2</version> 
     * </dependency> 
     **/ 
     private void fileCopyUsingApacheCommons() throws IOException { 
      File fileToCopy = new File("/tmp/test.txt"); 
      File newFile = new File("/tmp/testcopied.txt"); 

      File anotherFile = new File("/tmp/testcopied2.txt"); 

      FileUtils.copyFile(fileToCopy, newFile); 
     } 

ou tout simplement en utilisant un FileStream?

private void fileCopyUsingFileStreams() throws IOException { 
     File fileToCopy = new File("/tmp/test.txt"); 
     FileInputStream input = new FileInputStream(fileToCopy); 

     File newFile = new File("/tmp/test_and_once_again.txt"); 
     FileOutputStream output = new FileOutputStream(newFile); 

     byte[] buf = new byte[1024]; 
     int bytesRead; 

     while ((bytesRead = input.read(buf)) > 0) { 
      output.write(buf, 0, bytesRead); 
     } 

     input.close(); 
     output.close(); 
    } 
+0

J'utilisais un FileStream dans mon code précédent et cela fonctionnait bien, donc je pense que je m'en tiendrai à cela si je ne peux pas résoudre les problèmes de perfomance. Je ne veux pas vraiment utiliser d'autres bibliothèques pour une si petite partie de mon projet, mais j'ai vu beaucoup de gens suggérant Apache Commons. – Clara