La classe de fichier Java

1. Vue d'ensemble

Dans ce didacticiel, nous donnerons un aperçu de la classe File , qui fait partie de l' API java.io. La classe File nous donne la possibilité de travailler avec des fichiers et des répertoires sur le système de fichiers .

2. Création d'un objet fichier

La classe File a 4 constructeurs publics. Selon les besoins du développeur, différents types d'instances de la classe File peuvent être créés.

  • File (String pathname) - Crée une instance représentant le chemin donné
  • File (String parent, String child) - Crée une instance qui représente le chemin formé en joignant le parent et les chemins enfants
  • File (File parent, String child) - Crée une instance avec le chemin formé en joignant le chemin parent représenté par une autre instance File et le chemin enfant
  • Fichier (URI uri) - Crée une instance qui représente l'identificateur de ressource uniforme donné

3. Utilisation de la classe File

La classe File a un certain nombre de méthodes qui nous permettent de travailler avec et de manipuler des fichiers sur le système de fichiers. Nous en soulignerons quelques-uns ici. Il est important de noter que la classe File ne peut pas modifier ou accéder au contenu du fichier qu'elle représente.

3.1. Création et suppression de répertoires et de fichiers

La classe File a des méthodes d'instance pour créer et supprimer des répertoires et des fichiers. Les répertoires et les fichiers sont créés à l'aide des méthodes mkdir et createNewFile , respectivement.

Les répertoires et les fichiers sont supprimés à l'aide de la méthode de suppression . Toutes ces méthodes renvoient une valeur booléenne qui est true lorsque l'opération réussit et false dans le cas contraire:

@Test public void givenDir_whenMkdir_thenDirIsDeleted() { File directory = new File("dir"); assertTrue(directory.mkdir()); assertTrue(directory.delete()); } @Test public void givenFile_whenCreateNewFile_thenFileIsDeleted() { File file = new File("file.txt"); try { assertTrue(file.createNewFile()); } catch (IOException e) { fail("Could not create " + "file.txt"); } assertTrue(file.delete()); }

Dans l'extrait de code ci-dessus, nous voyons également d' autres méthodes utiles .

La méthode isDirectory peut être utilisée pour tester si le fichier désigné par le nom fourni est un répertoire, tandis que la méthode isFile peut être utilisée pour tester si le fichier désigné par le nom fourni est un fichier. Et, nous pouvons utiliser la méthode exist pour tester si un répertoire ou un fichier existe déjà sur le système.

3.2. Obtention de métadonnées sur les instances de fichier

La classe File a un certain nombre de méthodes qui renvoient des métadonnées sur les instances File . Voyons voir comment utiliser le getName, getParentFile, et GetPath méthodes :

@Test public void givenFile_whenCreateNewFile_thenMetadataIsCorrect() { String sep = File.separator; File parentDir = makeDir("filesDir"); File child = new File(parentDir, "file.txt"); try { child.createNewFile(); } catch (IOException e) { fail("Could not create " + "file.txt"); } assertEquals("file.txt", child.getName()); assertEquals(parentDir.getName(), child.getParentFile().getName()); assertEquals(parentDir.getPath() + sep + "file.txt", child.getPath()); removeDir(parentDir); }

Ici, nous avons illustré la validation des métadonnées sur le fichier qui a été créé dans le répertoire. Nous avons également montré comment trouver le parent du fichier et le chemin relatif de ce fichier.

3.3. Définition des autorisations de fichier et de répertoire

La classe File possède des méthodes qui vous permettent de définir des autorisations sur un fichier ou un répertoire. Ici, nous allons regarder les ensembles setWritable et setReadableméthodes :

@Test public void givenReadOnlyFile_whenCreateNewFile_thenCantModFile() { File parentDir = makeDir("readDir"); File child = new File(parentDir, "file.txt"); try { child.createNewFile(); } catch (IOException e) { fail("Could not create " + "file.txt"); } child.setWritable(false); boolean writable = true; try (FileOutputStream fos = new FileOutputStream(child)) { fos.write("Hello World".getBytes()); // write operation fos.flush(); } catch (IOException e) { writable = false; } finally { removeDir(parentDir); } assertFalse(writable); }

Dans le code ci-dessus, nous essayons d'écrire dans un fichier après avoir explicitement défini des autorisations sur celui-ci qui bloque toute écriture. Nous faisons cela avec la méthode setWritable . Tenter d'écrire dans un fichier lorsque l'écriture dans le fichier n'est pas autorisée entraîne la levée d' une IOException .

Ensuite, nous essayons de lire à partir d'un fichier après avoir défini des autorisations qui bloquent toute lecture. Les lectures sont bloquées à l'aide de la méthode setReadable :

@Test public void givenWriteOnlyFile_whenCreateNewFile_thenCantReadFile() { File parentDir = makeDir("writeDir"); File child = new File(parentDir, "file.txt"); try { child.createNewFile(); } catch (IOException e) { fail("Could not create " + "file.txt"); } child.setReadable(false); boolean readable = true; try (FileInputStream fis = new FileInputStream(child)) { fis.read(); // read operation } catch (IOException e) { readable = false; } finally { removeDir(parentDir); } assertFalse(readable); }

Là encore, la machine virtuelle Java lèvera une exception IOException pour les tentatives de lecture d'un fichier où les lectures ne sont pas autorisées .

3.4. Liste des fichiers dans un répertoire

La classe File a des méthodes qui nous permettent de lister les fichiers contenus dans un répertoire. De même, les répertoires peuvent également être répertoriés. Ici, nous allons examiner la liste et la liste des méthodes (FilenameFilter) :

@Test public void givenFilesInDir_whenCreateNewFile_thenCanListFiles() { File parentDir = makeDir("filtersDir"); String[] files = {"file1.csv", "file2.txt"}; for (String file : files) { try { new File(parentDir, file).createNewFile(); } catch (IOException e) { fail("Could not create " + file); } } //normal listing assertEquals(2, parentDir.list().length); //filtered listing FilenameFilter csvFilter = (dir, ext) -> ext.endsWith(".csv"); assertEquals(1, parentDir.list(csvFilter).length); removeDir(parentDir); }

Nous avons créé un répertoire et y avons ajouté deux fichiers - l'un avec une extension csv et l'autre avec une extension txt . Lors de la liste de tous les fichiers du répertoire, nous obtenons deux fichiers comme prévu. Lorsque nous filtrons la liste en filtrant autour des fichiers avec une extension csv , nous ne renvoyons qu'un seul fichier.

3.5. Renommer des fichiers et des répertoires

La classe File a la fonctionnalité de renommer des fichiers et des répertoires à l'aide de la méthode renameTo :

@Test public void givenDir_whenMkdir_thenCanRenameDir() { File source = makeDir("source"); File destination = makeDir("destination"); boolean renamed = source.renameTo(destination); if (renamed) { assertFalse(source.isDirectory()); assertTrue(destination.isDirectory()); removeDir(destination); } }

Dans l'exemple ci-dessus, nous créons deux répertoires - les répertoires source et de destination. Nous renommons ensuite le répertoire source en répertoire de destination à l'aide de la méthode renameTo . La même chose peut être utilisée pour renommer des fichiers au lieu de répertoires.

3.6. Obtention d'informations sur l'espace disque

La classe File nous permet également d'obtenir des informations sur l'espace disque. Voyons une démonstration de la méthode getFreeSpace :

@Test public void givenDataWritten_whenWrite_thenFreeSpaceReduces() { String home = System.getProperty("user.home"); String sep = File.separator; File testDir = makeDir(home + sep + "test"); File sample = new File(testDir, "sample.txt"); long freeSpaceBefore = testDir.getFreeSpace(); try { writeSampleDataToFile(sample); } catch (IOException e) { fail("Could not write to " + "sample.txt"); } long freeSpaceAfter = testDir.getFreeSpace(); assertTrue(freeSpaceAfter < freeSpaceBefore); removeDir(testDir); }

Dans cet exemple, nous avons créé un répertoire dans le répertoire de base de l'utilisateur, puis nous avons créé un fichier dedans. Nous avons ensuite vérifié si l'espace libre sur la partition du répertoire personnel avait changé après avoir rempli ce fichier avec du texte. Les autres méthodes qui fournissent des informations sur l'espace disque sont getTotalSpace et getUsableSpace .

4. Conclusion

Dans ce didacticiel, nous avons montré certaines des fonctionnalités fournies par la classe File pour travailler avec des fichiers et des répertoires sur le système de fichiers. .

Comme toujours, le code source complet de l'exemple est disponible à l'adresse over sur Github.