Méthode copy() de java.nio.file.Files en Java
java.nio.file.Files.copy()est une méthode utilitaire fournie dans le package Java NIO (New Input/Output), utilisée pour copier des fichiers ou des répertoires entre systèmes de fichiers. Cette méthode offre, comparée au traditionneljava.iopackage, des capacités de manipulation de fichiers plus efficaces et flexibles.
Surcharge de méthode
Files.copy()La méthode possède trois principales formes surchargées :
Copie d'un flux d'entrée vers un fichier
public static long copy(InputStream in, Path target, CopyOption... options) throws IOException
Copie d'un fichier vers un flux de sortie
public static long copy(Path source, OutputStream out) throws IOException
Copie de fichier à fichier
public static Path copy(Path source, Path target, CopyOption... options) throws IOException
Détails des paramètres
Paramètres d'entrée
- InputStream in: le flux d'entrée à copier
- Path source: le chemin du fichier source
- Path target: le chemin du fichier cible
- OutputStream out: le flux de sortie dans lequel écrire
- CopyOption... options: options de copie facultatives
Options de CopyOption
Couramment utiliséesCopyOptionincluent :
StandardCopyOption.REPLACE_EXISTING: Si le fichier cible existe déjà, le remplacerStandardCopyOption.COPY_ATTRIBUTES: Copier les attributs de fichier vers le nouveau fichierLinkOption.NOFOLLOW_LINKS: Ne pas suivre les liens symboliques
Valeur de retour
- Pour la copie de flux vers fichier : renvoie le nombre d'octets copiés
- Pour la copie de fichier vers fichier : renvoie le chemin du fichier cible
- Pour la copie de fichier vers flux : renvoie le nombre d'octets copiés
Exemples d'utilisation
Copie de fichier de base
Exemple
Path source = Paths.get("source.txt");
Path target = Paths.get("target.txt");
try {
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Fichier copié avec succès");
} catch (IOException e) {
System.err.println("Échec de la copie : " + e.getMessage());
}
Path target = Paths.get("target.txt");
try {
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Fichier copié avec succès");
} catch (IOException e) {
System.err.println("Échec de la copie : " + e.getMessage());
}
Copie de fichier avec attributs
Exemple
Path source = Paths.get("source.txt");
Path target = Paths.get("target.txt");
try {
Files.copy(source, target,
StandardCopyOption.REPLACE_EXISTING,
StandardCopyOption.COPY_ATTRIBUTES);
System.out.println("Fichier et attributs copiés avec succès");
} catch (IOException e) {
System.err.println("Échec de la copie : " + e.getMessage());
}
Path target = Paths.get("target.txt");
try {
Files.copy(source, target,
StandardCopyOption.REPLACE_EXISTING,
StandardCopyOption.COPY_ATTRIBUTES);
System.out.println("Fichier et attributs copiés avec succès");
} catch (IOException e) {
System.err.println("Échec de la copie : " + e.getMessage());
}
Copie d'un flux d'entrée vers un fichier
Exemple
try (InputStream in = new URL("http://example.com/file.txt").openStream()) {
Path target = Paths.get("downloaded.txt");
long bytesCopied = Files.copy(in, target);
System.out.println("Téléchargement terminé, copié " + bytesCopied + " octets");
} catch (IOException e) {
System.err.println("Échec du téléchargement : " + e.getMessage());
}
Path target = Paths.get("downloaded.txt");
long bytesCopied = Files.copy(in, target);
System.out.println("Téléchargement terminé, copié " + bytesCopied + " octets");
} catch (IOException e) {
System.err.println("Échec du téléchargement : " + e.getMessage());
}
Notes
- Copie de répertoire:
Files.copy()La méthode ne copie pas récursivement le contenu du répertoire par défaut ; elle ne copie que les répertoires vides. - Liens symboliques: suivre les liens symboliques par défaut, sauf indication contraire
LinkOption.NOFOLLOW_LINKS - Atomicité: Les opérations de copie de fichiers ne sont pas atomiques et peuvent échouer pendant l'opération
- Performance: Pour les fichiers volumineux, la copie NIO est généralement plus efficace que les E/S traditionnelles
- Gestion des exceptions: Il faut gérer les exceptions qui peuvent être levées
IOException
Comparaison avec les E/S traditionnelles
| Fonctionnalité | NIO Files.copy() | E/S traditionnelles (FileInputStream/FileOutputStream) |
|---|---|---|
| Performance | Plus élevé | Inférieur |
| Richesse fonctionnelle | Plus riche | Basique |
| Gestion des exceptions | Plus concis | Plus fastidieux |
| Gestion des liens symboliques | Pris en charge | Non pris en charge |
| Copie des attributs de fichier | Pris en charge | Non pris en charge |
Bonnes pratiques
- Pour une copie simple de fichier, utilisez la plus basique
Files.copy()forme - Lorsque les attributs de fichier doivent être préservés, ajoutez le
COPY_ATTRIBUTESoption - Lors de la gestion d'un fichier cible qui peut déjà exister, utilisez
REPLACE_EXISTING - Pour les fichiers volumineux, envisagez d'utiliser
Files.copy()au lieu des méthodes d'E/S traditionnelles - Utilisez toujours try-with-resources pour gérer les ressources de flux
Java java.nio.file.Files