Le fichier de copie Java est une opération très courante. Mais la classe java.io.File n’a pas de méthode de raccourci pour copier un fichier de la source vers la destination. Ici, nous allons découvrir quatre façons différentes dont nous pouvons copier un fichier en Java.
Java Copier un Fichier
- Java Copier un Fichier – Flux
C’est la manière conventionnelle de copier un fichier en Java. Ici, nous créons deux fichiers – la source et la destination. Ensuite, nous créons un InputStream à partir de la source et nous l’écrivons dans le fichier de destination en utilisant OutputStream pour l’opération de copie de fichier Java. Voici la méthode qui peut être utilisée pour copier un fichier en Java en utilisant des flux.
private static void copyFileUsingStream(File source, File dest) throws IOException {
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream(source);
os = new FileOutputStream(dest);
byte[] buffer = new byte[1024];
int length;
while ((length = is.read(buffer)) > 0) {
os.write(buffer, 0, length);
}
} finally {
is.close();
os.close();
}
}
- Java Copier un Fichier – java.nio.channels.FileChannel
Les classes Java NIO ont été introduites dans Java 1.4 et FileChannel peut être utilisé pour copier un fichier en Java. Selon la documentation de la méthode transferFrom(), cette méthode de copie de fichier est censée être plus rapide que l’utilisation de flux pour copier des fichiers en Java. Voici la méthode qui peut être utilisée pour copier un fichier en utilisant FileChannel.
private static void copyFileUsingChannel(File source, File dest) throws IOException {
FileChannel sourceChannel = null;
FileChannel destChannel = null;
try {
sourceChannel = new FileInputStream(source).getChannel();
destChannel = new FileOutputStream(dest).getChannel();
destChannel.transferFrom(sourceChannel, 0, sourceChannel.size());
}finally{
sourceChannel.close();
destChannel.close();
}
}
- Java Copier un Fichier – Apache Commons IO FileUtils
Apache Commons IO FileUtils.copyFile(File srcFile, File destFile) peut être utilisé pour copier des fichiers en Java. Si vous utilisez déjà Apache Commons IO dans votre projet, il est logique d’utiliser ceci pour la simplicité du code. En interne, il utilise Java NIO FileChannel, donc vous pouvez éviter cette méthode d’enveloppe si vous ne l’utilisez pas déjà pour d’autres fonctions. Voici la méthode pour utiliser Apache Commons IO pour l’opération de copie de fichier en Java.
private static void copyFileUsingApacheCommonsIO(File source, File dest) throws IOException {
FileUtils.copyFile(source, dest);
}
- Copier un fichier en Java – classe Files
Si vous travaillez avec Java 7 ou une version ultérieure, vous pouvez utiliser la classe Files méthode copy() pour copier un fichier en Java. Elle utilise les fournisseurs de système de fichiers pour copier les fichiers.
private static void copyFileUsingJava7Files(File source, File dest) throws IOException {
Files.copy(source.toPath(), dest.toPath());
}
Maintenant, pour savoir quelle est la méthode la plus rapide, j’ai écrit une classe de test et exécuté les méthodes ci-dessus une par une pour copier un fichier de 1 Go. À chaque appel, j’ai utilisé des fichiers différents pour éviter tout avantage aux méthodes ultérieures en raison de la mise en cache.
package com.journaldev.files;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import org.apache.commons.io.FileUtils;
public class JavaCopyFile {
public static void main(String[] args) throws InterruptedException, IOException {
File source = new File("/Users/pankaj/tmp/source.avi");
File dest = new File("/Users/pankaj/tmp/dest.avi");
//copier un fichier de manière conventionnelle en utilisant Stream
long start = System.nanoTime();
copyFileUsingStream(source, dest);
System.out.println("Time taken by Stream Copy = "+(System.nanoTime()-start));
//copier des fichiers en utilisant java.nio FileChannel
source = new File("/Users/pankaj/tmp/sourceChannel.avi");
dest = new File("/Users/pankaj/tmp/destChannel.avi");
start = System.nanoTime();
copyFileUsingChannel(source, dest);
System.out.println("Time taken by Channel Copy = "+(System.nanoTime()-start));
//copier des fichiers en utilisant apache commons io
source = new File("/Users/pankaj/tmp/sourceApache.avi");
dest = new File("/Users/pankaj/tmp/destApache.avi");
start = System.nanoTime();
copyFileUsingApacheCommonsIO(source, dest);
System.out.println("Time taken by Apache Commons IO Copy = "+(System.nanoTime()-start));
//utilisation de la classe Java 7 Files
source = new File("/Users/pankaj/tmp/sourceJava7.avi");
dest = new File("/Users/pankaj/tmp/destJava7.avi");
start = System.nanoTime();
copyFileUsingJava7Files(source, dest);
System.out.println("Time taken by Java7 Files Copy = "+(System.nanoTime()-start));
}
}
Voici la sortie du programme ci-dessus, notez que j’ai commenté le code ci-dessus pour m’assurer qu’à chaque fois, une seule méthode est utilisée pour l’opération de copie de fichier Java.
Time taken by Stream Copy = 44582575000
Time taken by Channel Copy = 104138195000
Time taken by Apache Commons IO Copy = 108396714000
Time taken by Java7 Files Copy = 89061578000
D’après la sortie, il est clair que la copie de flux (Stream Copy) est la meilleure façon de copier un fichier en Java. Mais c’est un test très basique. Si vous travaillez sur un projet intensif en termes de performances, alors vous devriez essayer différentes méthodes pour la copie de fichiers en Java et noter les durées pour déterminer l’approche la plus adaptée à votre projet. Vous devriez également expérimenter différentes façons de copier des fichiers en Java en fonction de la taille moyenne du fichier. J’ai créé une vidéo YouTube présentant 4 façons de copier des fichiers en Java, vous pouvez la regarder pour en savoir plus. https://www.youtube.com/watch?v=op6tgG95zek
Source:
https://www.digitalocean.com/community/tutorials/java-copy-file