"Salut, Amigo. Longtemps, pas vu."

« Salut, Bilaabo. De quoi vas-tu parler ?

"Aujourd'hui, je vais vous parler du travail avec les fichiers.  Java a une classe spéciale (File) que vous pouvez utiliser pour gérer les fichiers sur un disque dur. Pour gérer le contenu des fichiers, il existe d'autres classes : FileInputStream, FileOutputStream, etc. "

Fichier, Fichiers, Chemin - 1

"Intéressant. Mais quand vous dites 'gérer les fichiers', qu'est-ce que vous voulez dire ?"

"C'est exactement ce que je vais expliquer maintenant. Les fichiers peuvent être créés, supprimés, renommés et bien plus encore. Vous pouvez passer un objet File à pratiquement toutes les classes qui fonctionnent avec (lit, écrit, modifie) le contenu d'un fichier . Par exemple:"

Vous pouvez passer le nom du fichier directement à FileInputStream
FileInputStream input = new FileInputStream("c:/path/a.txt");
Ou vous pouvez créer un objet File séparément, puis le transmettre à FileInputStrea
File file = new File("c:/path/a.txt");
FileInputStream input = new FileInputStream(file);

"Mais la deuxième option est plus longue. Je ne comprends toujours pas pourquoi nous avons besoin de ces objets de fichier."

"Pour cet exemple spécifique, vous avez raison. "Ce n'est pas un exemple de la façon dont vous devez le faire, mais plutôt de la façon dont vous pouvez le faire.
Mais imaginez que vous ayez besoin d'afficher une liste de tous les fichiers situés dans un répertoire spécifique. Voici comment cela peut être fait en utilisant des objets File :"

Code
File folder = new File("c:/path/");
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

"Est-ce que listFiles() est une méthode qui renvoie une liste de fichiers dans le dossier indiqué par « c:/path/ » ? »

"Oui. Mais les programmeurs disent généralement "répertoire". Le terme "dossier" est apparu relativement récemment, mais en principe, les deux termes sont corrects et vous pouvez dire celui que vous préférez."

"OK. Et que fait getName () ? Renvoie le nom du fichier ? Que contient exactement le nom ? Le nom complet, y compris le chemin, ou simplement le nom du fichier lui-même ?"

"Seul le nom du fichier lui-même. Pour le chemin complet, il y a file.getAbsolutePath()."

"Alors, quelles autres méthodes la classe File a-t-elle?"

"Regarde ça:"

Méthode Description
boolean isDirectory() L'objet File est-il un répertoire ?
boolean isFile() L'objet est-il un fichier ?
long length() Renvoie la taille/longueur du fichier en octets.
boolean createNewFile() Crée un nouveau fichier vide si un fichier portant ce nom n'existe pas encore.
boolean mkdir() Crée un répertoire. Le nom « mkdir » vient de « make directory ».
boolean mkdirs() Crée un répertoire et tous ses sous-répertoires.
boolean delete() Supprime le fichier associé à l'objet. Si l'objet est un répertoire, le répertoire est supprimé uniquement s'il ne contient aucun fichier.
void deleteOnExit() Ajoute le fichier à une liste spéciale de fichiers qui seront automatiquement supprimés à la fermeture du programme.
File createTempFile(
String prefix,
String suffix,
File directory)
Crée un fichier temporaire avec un nom unique généré aléatoirement, quelque chose comme « dasd4d53sd ».
Les paramètres supplémentaires sont un préfixe et un suffixe de nom. Si aucun répertoire n'est spécifié, le fichier est créé dans un répertoire spécial du système d'exploitation pour les fichiers temporaires.
boolean exists() Renvoie true si un fichier portant le même nom existe sur le disque dur.
String getAbsolutePath() Renvoie le chemin complet du fichier avec tous ses sous-répertoires.
String getCanonicalPath() Renvoie le chemin du fichier canonique.
Par exemple, convertit le chemin "c:/dir/dir2/../a.txt" en "c:/dir/a.txt"
String[] list() Renvoie un tableau des noms de fichiers contenus dans le répertoire représenté par l'objet courant.
File[] listFiles() Renvoie un tableau de fichiers contenus dans le répertoire représenté par l'objet File actuel.
long getTotalSpace() Renvoie la quantité d'espace total (nombre d'octets) sur le disque sur lequel se trouve le fichier.
long getFreeSpace() Renvoie la quantité d'espace libre (nombre d'octets) sur le disque sur lequel se trouve le fichier.
boolean renameTo(File) Renomme le fichier, c'est-à-dire que le contenu du fichier reçoit un nouveau nom. En d'autres termes, vous pouvez renommer le fichier « c:/dir/a.txt » en « d:/out/text/b.doc ».
String getName() Renvoie uniquement le nom du fichier sans le chemin.
String getParent() Renvoie uniquement le chemin (répertoire) du fichier courant, sans le nom lui-même.
Path toPath() Renvoie un objet Path qui correspond à l'objet File actuel.

"Whoa ! Ce n'est pas une très petite liste, hein ? Et il semble que vous puissiez faire beaucoup de choses avec : créer et supprimer des fichiers, les renommer,..."

"Donc, pour obtenir le répertoire du fichier en cours, je dois appeler getParent()?"

"Oui, mais elle renvoie une chaîne ― le chemin du fichier ― pas un objet File. En fait, la classe File duplique presque toutes ses méthodes : une version renvoie une chaîne, l'autre ― un objet File. Vérifiez-le :"

File file = new File("c:/path/a.txt");
String directory = file.getParent();
File file = new File("c:/path/a.txt");
File directory = file.getParentFile();

Si vous avez une chaîne avec le chemin du fichier et que vous avez besoin d'un objet File , utilisez le constructeur. Si la situation est inversée (vous avez un objet File mais vous avez besoin d'un String), alors utilisez getAbsolutePath (). Par exemple:"

String path = "c:/a.txt";
File file = new File(path);
File file = new File("c:/a.txt");
String path = file.getAbsolutePath();

"J'ai compris."

"Parfait. Alors voici une petite tâche pour vous : affichez les noms de tous les fichiers situés dans le même répertoire que le fichier en cours."

"Rien de plus facile. Tiens, regarde :"

Code
//Some file
File originalFile = new File("c:/path/dir2/a.txt");

//An object representing the directory
File folder = originalFile.getParentFile();

//Print the file list on screen
for (File file : folder.listFiles())
{
 System.out.println(file.getName());
}

"Hmm. Correct."

"Mais c'est un peu déroutant que la même classe ― File ― soit utilisée à la fois pour le fichier et le répertoire. Cela ne me semble pas très logique."

"Cela a fonctionné de cette façon pour des raisons historiques. Un répertoire était auparavant un fichier "vide" spécial sur le disque. Bien sûr, maintenant beaucoup de choses ont changé, mais pas tout. C'est tout ce que j'ai aujourd'hui."

"Merci pour la leçon intéressante, Bilaabo."