Méthode copy() de java.nio.file.Files en Java

Java File Java java.nio.file.Files


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 remplacer
  • StandardCopyOption.COPY_ATTRIBUTES: Copier les attributs de fichier vers le nouveau fichier
  • LinkOption.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());
}

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());
}

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());
}

Notes

  1. 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.
  2. Liens symboliques: suivre les liens symboliques par défaut, sauf indication contraireLinkOption.NOFOLLOW_LINKS
  3. Atomicité: Les opérations de copie de fichiers ne sont pas atomiques et peuvent échouer pendant l'opération
  4. Performance: Pour les fichiers volumineux, la copie NIO est généralement plus efficace que les E/S traditionnelles
  5. Gestion des exceptions: Il faut gérer les exceptions qui peuvent être levéesIOException

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

  1. Pour une copie simple de fichier, utilisez la plus basiqueFiles.copy()forme
  2. Lorsque les attributs de fichier doivent être préservés, ajoutez leCOPY_ATTRIBUTESoption
  3. Lors de la gestion d'un fichier cible qui peut déjà exister, utilisezREPLACE_EXISTING
  4. Pour les fichiers volumineux, envisagez d'utiliserFiles.copy()au lieu des méthodes d'E/S traditionnelles
  5. Utilisez toujours try-with-resources pour gérer les ressources de flux

Java File Java java.nio.file.Files

Autres extensions