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
}
}
'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
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