2017-05-24 4 views
4

J'ai lu un article concernant la copie de trasfer à https://www.ibm.com/developerworks/library/j-zerocopy/. qui suggèrent au canal d'utilisateur pour le fonctionnement d'E/S.Java: copier des fichiers efficacement avec le canal

Il y a une banchmark d'opération de copie de fichier disponible à https://baptiste-wicht.com/posts/2010/08/file-copy-in-java-benchmark.html

Comme par référence je peux utiliser soit tampon nio ou trasfer nio

Je lis aussi FileChannel ne buffereing dans le système d'exploitation niveau ici How to implement a buffered/batched FileChannel in Java?

Quel est le moyen le plus efficace de flic y fichier avec tampon ou avec tampon.

code tampon nio

public static void nioBufferCopy(File sourceFile, File targetFile, int BUFFER) { 
     FileChannel inputChannel = null; 
     FileChannel outputChannel = null; 
     try { 
      inputChannel = new FileInputStream(sourceFile).getChannel(); 
      outputChannel = new FileOutputStream(targetFile).getChannel(); 
      ByteBuffer buffer = ByteBuffer.allocateDirect(BUFFER); 
      while (inputChannel.read(buffer) != -1) { 
       buffer.flip();   
       while(buffer.hasRemaining()){ 
        outputChannel.write(buffer); 
       }   
       buffer.clear(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      //close resource 
     } 
} 

code pour trasfer nio

public void copyFileWithChannels(File aSourceFile, File aTargetFile) {    
     FileChannel inChannel = null; 
     FileChannel outChannel = null; 
     FileInputStream inStream = null; 
     FileOutputStream outStream = null;  
     try { 
      inStream = new FileInputStream(aSourceFile); 
      inChannel = inStream.getChannel(); 
      outStream = new FileOutputStream(aTargetFile);   
      outChannel = outStream.getChannel(); 
      long bytesTransferred = 0; 
      while(bytesTransferred < inChannel.size()){ 
       bytesTransferred += inChannel.transferTo(bytesTransferred, inChannel.size(), outChannel); 
      } 
     }  
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
     finally { 
      //close resource 
     }    
} 
+2

'FileChannel' ne fait pas de mise en mémoire tampon dans le système d'exploitation, au-delà de ce que fait le système d'exploitation pour tout fichier ouvert. Votre premier code n'est pas optimal, mais. les API de transfert sont les plus efficaces, – EJP

+1

si vous voulez vraiment une copie de fichier vraiment efficace, alors java est le mauvais outil pour le travail. sur les unix, vous voudrez utiliser des copies de reflink si elles sont disponibles et chercher des trous dans les fichiers épars sinon. Et sur Linux, l'astuce splice + pipe peut éviter de copier dans l'espace utilisateur. Mais aucune de ces choses n'est exposée dans la bibliothèque standard java. Eh bien, avec de la colle JNA ou JNR, ce serait possible en Java bien sûr. – the8472

Répondre