Table of Contents
Opérations de fichier avec Java : une introduction
Introduction
Lorsque vous développez des applications avec Java, il est souvent nécessaire d’interagir avec les fichiers sur le système de fichiers. Que ce soit pour lire ou écrire des données, copier des fichiers, ou même simplement vérifier l’existence de fichier, la bibliothèque java.io et java.nio.file fournit les outils nécessaires pour réaliser ces opérations.
Dans cet article, nous allons explorer les différentes façons d’interagir avec les fichiers en Java. Nous aborderons notamment les classes File, Path, Files et Channels qui sont les fondements de l’API de fichier Java.
Convertir entre File et Path
La première chose à savoir est que les classes File et Path sont deux façons différentes de représenter un chemin de fichier. La classe File est une représentation traditionnelle d’un chemin de fichier, tandis que la classe Path est plus récente et fournit une API plus flexible.
Pour convertir une instance de File en instance de Path, vous pouvez utiliser la méthode toPath() :
File file = new File("C:/");
Path path = file.toPath();
Et pour l’inverse, vous pouvez utiliser la méthode toFile() :
Path path = Paths.get("C:/");
File file = path.toFile();
Vérifier si un fichier existe et le supprimer
Il est souvent nécessaire de vérifier si un fichier existe avant d’y accéder. Pour cela, vous pouvez utiliser la méthode exists() de la classe File :
if (file.exists()) {
boolean deleted = file.delete();
if (!deleted) {
throw new IOException("Impossible de supprimer le fichier");
}
}
De même, vous pouvez utiliser la méthode deleteIfExists() de la classe Files pour supprimer un fichier s’il existe :
Files.deleteIfExists(path);
Écrire dans un fichier via un OutputStream
Lorsque vous devez écrire des données dans un fichier, vous avez plusieurs options. Vous pouvez utiliser une instance de FileOutputStream, qui est plus simple à utiliser mais moins flexible. Ou bien, vous pouvez utiliser les méthodes write() et newOutputStream() de la classe Files :
try (OutputStream outputStream = Files.newOutputStream(path, StandardOpenOption.CREATE_NEW)) {
for (String line : lines) {
outputStream.write((line + System.lineSeparator()).getBytes(StandardCharsets.UTF_8));
}
}
Iterer sur chaque fichier dans un dossier
Lorsque vous devez interagir avec tous les fichiers d’un dossier, vous pouvez utiliser la méthode listFiles() de la classe File ou les méthodes walkFileTree() et new FileVisitor() de la classe Files :
for (File selectedFile : folder.listFiles()) {
System.out.println((selectedFile.isDirectory() ? "d" : "f") + " " + selectedFile.getAbsolutePath());
}
Ou bien, vous pouvez utiliser les méthodes walkFileTree() et new FileVisitor() de la classe Files :
Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path selectedPath, BasicFileAttributes attrs) throws IOException {
System.out.println("d " + selectedPath.toAbsolutePath());
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path selectedPath, BasicFileAttributes attrs) throws IOException {
System.out.println("f " + selectedPath.toAbsolutePath());
return FileVisitResult.CONTINUE;
}
});
Lecture d’un image depuis un fichier
Lorsque vous devez lire une image depuis un fichier, vous pouvez utiliser la classe ImageIO :
try {
Image img = ImageIO.read(new File("~/Desktop/cat.png"));
} catch (IOException e) {
e.printStackTrace();
}
Lecture/écriture de fichiers avec FileInputStream/FileOutputStream
Lorsque vous devez lire ou écrire des données dans un fichier, vous pouvez utiliser les classes FileInputStream et FileOutputStream :
String filepath = "C:\\test.txt";
try (FileOutputStream fos = new FileOutputStream(filepath)) {
byte[] buffer = "This will be written in test.txt".getBytes();
fos.write(buffer, 0, buffer.length);
}
Ou bien, vous pouvez utiliser les méthodes readAllBytes() et write() de la classe Files :
String filepath = "C:\\test.txt";
try {
byte[] data = Files.readAllBytes(path);
} catch (IOException e) {
e.printStackTrace();
}
Copie d’un fichier avec Channel
Lorsque vous devez copier un fichier, vous pouvez utiliser les classes FileChannel et transferTo() :
public class FileCopier {
public static void main(String[] args) {
File sourceFile = new File("hello.txt");
File sinkFile = new File("hello2.txt");
copy(sourceFile, sinkFile);
}
public static void copy(File sourceFile, File destFile) {
try (FileChannel srcChannel = new FileInputStream(sourceFile).getChannel();
FileChannel sinkChanel = new FileOutputStream(destFile).getChannel()) {
srcChannel.transferTo(0, srcChannel.size(), sinkChanel);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Conclusion
Dans cet article, nous avons vu les différentes façons d’interagir avec les fichiers en Java. Nous avons abordé les classes File, Path, Files et Channels qui sont les fondements de l’API de fichier Java.
Nous espérons que cet article vous aura été utile pour comprendre comment utiliser ces classes pour interagir avec les fichiers.
Étapes suivantes
- Consultez la documentation officielle de Java pour en savoir plus sur les classes
File,Path,FilesetChannels. - Examinez les exemples de code fournis dans cet article pour comprendre comment utiliser ces classes.
- Essayez d’implémenter les opérations de fichier décrites dans cet article dans votre propre projet Java.
In-Article Ad
Dev Mode
Mahmoud DEVO
Senior Full-Stack Developer
I'm a passionate full-stack developer with 10+ years of experience building scalable web applications. I write about Vue.js, Node.js, PostgreSQL, and modern DevOps practices.
Enjoyed this article?
Subscribe to get more tech content delivered to your inbox.
Related Articles
Manipuler les classes Java avec ASM et Javassist : bytecode, instrumentation et fichiers JAR
Apprenez a manipuler les classes Java avec ASM et Javassist : chargement, modification du bytecode, instrumentation et creation de fichiers JAR.
Synchronisation Java avec AtomicInteger : eviter la contention et optimiser les performances
Decouvrez comment utiliser les types atomiques Java (AtomicInteger, AtomicLong, AtomicReference, AtomicBoolean) pour reduire la contention, eviter les blocages et ameliorer les performances.
Les avantages des flux tampons pour une performance optimale
Ameliorez les performances de votre code Java avec les flux tampons ! Decouvrez comment reduire considerablement le nombre d'appels systeme, optimiser l'utilisation des types primitifs, gerer efficacement la journalisation et iterer sur les Maps de maniere performante.