1. Copie de fichiers
Méthode Files.copy : syntaxe de base
En Java, la copie de fichiers et de dossiers s’effectue via la méthode statique Files.copy du package java.nio.file. Nous l’avons déjà croisée, mais allons maintenant l’étudier plus en détail. Syntaxe de base de Files.copy :
Files.copy(Path source, Path target, CopyOption... options)
- source — chemin vers le fichier ou le dossier source.
- target — chemin de destination.
- options — options supplémentaires (par exemple, autoriser l’écrasement).
Exemple le plus simple
Copions le fichier "input.txt" du répertoire courant vers le dossier "backup" sous le nom "input_backup.txt" :
import java.nio.file.*;
public class CopyExample {
public static void main(String[] args) throws Exception {
Path source = Path.of("input.txt");
Path target = Path.of("backup/input_backup.txt");
Files.copy(source, target);
System.out.println("Fichier copié !");
}
}
Points importants :
- Si le fichier de destination existe déjà, une exception FileAlreadyExistsException sera levée.
- Si le dossier "backup" n’existe pas, la méthode lèvera une erreur — le dossier doit être créé au préalable !
Copie avec écrasement
Pour autoriser l’écrasement d’un fichier, utilisez l’option StandardCopyOption.REPLACE_EXISTING :
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
Tableau : principales options de copie
| Option | Description |
|---|---|
|
Écraser le fichier s’il existe déjà |
|
Copier les attributs (date de création, etc.) |
|
Déplacement atomique (utilisé uniquement avec move) |
Copier un fichier vers un autre dossier
Avant de copier un fichier, assurez-vous que le dossier de destination existe :
Path targetDir = Path.of("backup");
if (!Files.exists(targetDir)) {
Files.createDirectory(targetDir);
}
Files.copy(source, targetDir.resolve("input_backup.txt"), StandardCopyOption.REPLACE_EXISTING);
Copie de dossiers : le piège
La méthode Files.copy ne sait copier les dossiers que comme « coquille vide » — le contenu (fichiers et sous-dossiers) n’est pas copié ! Si vous essayez de copier un dossier contenant des fichiers, vous n’obtiendrez qu’un répertoire vide. Pour copier des dossiers entiers avec leur contenu, il faut un parcours récursif et la copie manuelle de chaque fichier (nous y reviendrons dans les prochaines leçons).
Exemple : copier un fichier d’un dossier à un autre
Path source = Path.of("data/report.txt");
Path target = Path.of("backup/report.txt");
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
Gestion des erreurs lors de la copie
La copie peut échouer pour diverses raisons : pas d’accès, fichier occupé, espace insuffisant, fichier déjà présent, etc. Il vaut mieux utiliser systématiquement try-catch :
try {
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Copie réussie !");
} catch (FileAlreadyExistsException e) {
System.out.println("Le fichier existe déjà : " + target);
} catch (IOException e) {
System.out.println("Erreur d'entrée/sortie : " + e.getMessage());
}
2. Déplacement de fichiers et de dossiers
Méthode Files.move : syntaxe
Le déplacement de fichiers et de dossiers s’effectue avec la méthode :
Files.move(Path source, Path target, CopyOption... options)
Où source est le chemin du fichier (emplacement d’origine), target est l’endroit où placer le fichier ou le dossier, et options sont des paramètres supplémentaires (par exemple, remplacement d’un fichier existant).
À propos, déplacer n’est pas seulement « déménager » un fichier, c’est aussi un moyen de le renommer (si seul le nom change). Et si un fichier portant ce nom existe déjà dans le dossier cible, une exception sera levée à moins d’indiquer l’option REPLACE_EXISTING.
Exemple : déplacement d’un fichier vers un autre dossier
Path source = Path.of("data/report.txt");
Path target = Path.of("archive/report.txt");
Files.move(source, target);
System.out.println("Fichier déplacé !");
Déplacement avec remplacement du fichier existant
Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
Déplacement d’un dossier
Path oldDir = Path.of("data/old_reports");
Path newDir = Path.of("archive/old_reports");
Files.move(oldDir, newDir);
Le dossier entier, y compris les fichiers et sous-dossiers, sera déplacé vers le nouvel emplacement.
Mais si un dossier portant le même nom existe déjà dans le dossier cible — vous obtiendrez une erreur.
Déplacement entre différents systèmes de fichiers
Si vous déplacez un fichier entre différents disques (par exemple, de "C:" vers "D:"), sous le capot il s’agira d’une copie suivie de la suppression du fichier source. Si l’opération n’est pas prise en charge comme atomique, une exception AtomicMoveNotSupportedException peut être levée.
Différence entre move et copy
- copy — le fichier/le dossier d’origine reste en place, une copie est créée.
- move — le fichier/le dossier d’origine disparaît, seul le nouvel exemplaire reste.
3. Renommage de fichiers et de dossiers
En Java, il n’existe pas de méthode distincte « renommer un fichier ». Le renommage est un cas particulier du déplacement : vous indiquez un nouveau chemin avec un autre nom dans le même répertoire.
Exemple : renommer un fichier
Supposons que nous ayons le fichier "report.txt" et que nous voulions le renommer en "report_old.txt" dans le même dossier :
Path dir = Path.of("data");
Path oldName = dir.resolve("report.txt");
Path newName = dir.resolve("report_old.txt");
Files.move(oldName, newName);
System.out.println("Fichier renommé !");
Points importants
Si un fichier ou un dossier portant le nom indiqué existe déjà dans le répertoire cible, la méthode lèvera une exception. Pour contourner cette restriction et autoriser le remplacement, vous pouvez utiliser l’option StandardCopyOption.REPLACE_EXISTING.
Exemple :
Path source = Paths.get("old_name.txt");
Path target = Paths.get("new_name.txt");
// Renommer le fichier ; s'il existe déjà — le remplacer
Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
Dans cet exemple, le fichier "old_name.txt" sera renommé en "new_name.txt". S’il y avait déjà un fichier portant ce nom dans le dossier, il sera écrasé.
Renommer un dossier
Path oldDir = Path.of("data/old_reports");
Path newDir = Path.of("data/archived_reports");
Files.move(oldDir, newDir);
System.out.println("Dossier renommé !");
4. Gestion des erreurs lors de la copie, du déplacement et du renommage
Travailler avec le système de fichiers comporte toujours un risque de situations imprévues. Voici les problèmes les plus fréquents :
Le fichier existe déjà.
Exception : FileAlreadyExistsException. Solution : utilisez REPLACE_EXISTING si vous souhaitez l’écraser.
Le fichier ou le dossier est occupé par un autre processus.
Exception : IOException. Par exemple, le fichier est ouvert dans un autre programme.
Aucun accès au fichier ou au dossier.
Exception : AccessDeniedException. Problème de droits utilisateur.
Déplacement entre différents systèmes de fichiers.
Exception : AtomicMoveNotSupportedException. Tous les systèmes de fichiers ne prennent pas en charge le déplacement atomique.
Le dossier de destination n’existe pas.
Pour la copie/le déplacement, assurez-vous que le dossier de destination est créé au préalable !
Exemple de gestion des erreurs
try {
Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
} catch (FileAlreadyExistsException e) {
System.out.println("Le fichier de destination existe déjà : " + target);
} catch (AtomicMoveNotSupportedException e) {
System.out.println("Le déplacement atomique n'est pas pris en charge : " + e.getMessage());
} catch (IOException e) {
System.out.println("Erreur lors du déplacement : " + e.getMessage());
}
5. Recommandations pratiques
Vérifier l’existence du fichier/dossier cible
Avant de copier ou de déplacer, il est toujours utile de vérifier si le chemin de destination est déjà pris :
if (Files.exists(target)) {
System.out.println("Le fichier existe déjà, on ne l'écrase pas.");
} else {
Files.copy(source, target);
}
Utiliser des fichiers temporaires pour des opérations sûres
Pour des opérations complexes (par exemple, la mise à jour de fichiers importants), on utilise souvent des fichiers temporaires — on copie d’abord vers un fichier temporaire, puis on remplace le fichier principal :
Path temp = Path.of("data/report.tmp");
Files.copy(source, temp, StandardCopyOption.REPLACE_EXISTING);
Files.move(temp, target, StandardCopyOption.REPLACE_EXISTING);
Cette approche minimise le risque de perte de données en cas de panne.
Exemple : sauvegarde d’un fichier avant remplacement
Path file = Path.of("data/report.txt");
Path backup = Path.of("data/report_backup.txt");
if (Files.exists(file)) {
Files.copy(file, backup, StandardCopyOption.REPLACE_EXISTING);
System.out.println("Sauvegarde créée.");
}
6. Tableau : méthodes et options principales
| Opération | Méthode Java NIO | Particularités |
|---|---|---|
| Copie | |
Ne copie pas le contenu des dossiers ! |
| Déplacement | |
Peut être utilisé pour renommer |
| Renommage | |
Nouveau chemin dans le même répertoire |
| Écrasement | |
Écrase le fichier/le dossier de destination |
| Vérification | |
Vérifie l’existence du fichier/dossier |
7. Erreurs typiques lors de la copie, du déplacement et du renommage de fichiers
Erreur n°1 : tentative de copier un fichier vers un dossier inexistant. Si le répertoire cible n’est pas créé, vous obtiendrez NoSuchFileException. Solution : créer le dossier à l’avance avec Files.createDirectories.
Erreur n°2 : tentative de copier un dossier entier avec Files.copy. La méthode ne copiera qu’une « coquille vide », pas le contenu. Pour une copie complète, un parcours récursif est nécessaire.
Erreur n°3 : absence de gestion d’un fichier existant. Si vous ne passez pas REPLACE_EXISTING et que le fichier existe déjà, une exception sera levée. Il vaut mieux gérer explicitement ce cas.
Erreur n°4 : tentative de renommer un fichier alors qu’un fichier portant le nouveau nom existe déjà. De même, vous obtiendrez FileAlreadyExistsException. Avant de renommer, vous pouvez vérifier la présence du fichier.
Erreur n°5 : déplacement entre différents systèmes de fichiers. Parfois, l’opération n’est pas prise en charge de façon « atomique » et AtomicMoveNotSupportedException est levée. Dans ce cas, utilisez un déplacement classique sans atomicité.
Erreur n°6 : absence de droits d’accès ou verrouillage du fichier. Si le fichier est ouvert dans un autre programme ou si vous n’avez pas les droits d’écriture/lecture, vous obtiendrez AccessDeniedException ou IOException. Gérez toujours ces exceptions.
GO TO FULL VERSION