La classe di file Java

1. Panoramica

In questo tutorial, forniremo una panoramica della classe File , che fa parte dell'API java.io. La classe File ci dà la possibilità di lavorare con file e directory sul file system .

2. Creazione di un oggetto file

La classe File ha 4 costruttori pubblici. A seconda delle esigenze dello sviluppatore, è possibile creare diversi tipi di istanze della classe File .

  • File (String pathname) : crea un'istanza che rappresenta il percorso specificato
  • File (String genitore, String figlio) : crea un'istanza che rappresenta il percorso formato dall'unione dei percorsi genitore e figlio
  • File (File padre, String figlio) - Crea un'istanza con il percorso formato unendo il percorso padre rappresentato da un'altra istanza File e il percorso figlio
  • File (URI uri) : crea un'istanza che rappresenta l'identificatore di risorsa uniforme fornito

3. Lavorare con la classe di file

La classe File ha una serie di metodi che ci consentono di lavorare con e manipolare i file sul file system. Ne evidenzieremo alcuni qui. È importante notare che la classe File non può modificare o accedere al contenuto del file che rappresenta.

3.1. Creazione ed eliminazione di directory e file

La classe File dispone di metodi di istanza per creare ed eliminare directory e file. Directory e file vengono creati utilizzando rispettivamente i metodi mkdir e createNewFile .

Directory e file vengono eliminati utilizzando il metodo di eliminazione . Tutti questi metodi restituiscono un valore booleano che è vero quando l'operazione riesce e falso in caso contrario:

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

Nello snippet sopra, vediamo anche altri metodi utili .

Il metodo isDirectory può essere utilizzato per verificare se il file indicato dal nome fornito è una directory, mentre il metodo isFile può essere utilizzato per verificare se il file indicato con il nome fornito è un file. Inoltre, possiamo utilizzare il metodo exist per verificare se una directory o un file esiste già nel sistema.

3.2. Recupero di metadati sulle istanze di file

La classe File ha una serie di metodi che restituiscono metadati sulle istanze di File . Vediamo come utilizzare i metodi getName, getParentFile e getPath :

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

Qui, abbiamo illustrato la convalida dei metadati sul file che è stato creato all'interno della directory. Abbiamo anche mostrato come trovare il genitore del file e il percorso relativo a quel file.

3.3. Impostazione delle autorizzazioni per file e directory

La classe File dispone di metodi che consentono di impostare le autorizzazioni su un file o una directory. Qui, esamineremo setWritable e setReadablemetodi :

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

Nel codice sopra, proviamo a scrivere su un file dopo aver impostato esplicitamente le autorizzazioni su di esso che bloccano qualsiasi scrittura. Lo facciamo con il metodo setWritable . Il tentativo di scrivere su un file durante la scrittura sul file non è consentito, genera un'eccezione IOException .

Successivamente, proviamo a leggere da un file dopo aver impostato le autorizzazioni su di esso che bloccano qualsiasi lettura. Le letture vengono bloccate utilizzando il metodo 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); }

Anche in questo caso, la JVM genererà un'eccezione IOException per i tentativi di leggere un file in cui le letture non sono consentite .

3.4. Elenco dei file all'interno di una directory

La classe File ha metodi che ci consentono di elencare i file contenuti in una directory. Allo stesso modo, anche le directory possono essere elencate. Qui esamineremo i metodi list e list (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); }

Abbiamo creato una directory e aggiunto due file, uno con estensione csv e l'altro con estensione txt . Quando si elencano tutti i file nella directory, otteniamo due file come previsto. Quando filtriamo l'elenco filtrando i file con estensione csv , viene restituito un solo file.

3.5. Ridenominazione di file e directory

La classe File ha la funzionalità di rinominare file e directory utilizzando il metodo 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); } }

In the example above, we create two directories — the source and the destination directories. We then rename the source directory to the destination directory using the renameTo method. The same can be used to rename files instead of directories.

3.6. Getting Disk Space Information

The File class also allows us to get disk space information. Let's see a demonstration of the getFreeSpace method:

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

In questo esempio, abbiamo creato una directory all'interno della home directory dell'utente e quindi abbiamo creato un file in essa. Abbiamo quindi verificato se lo spazio libero sulla partizione della directory home fosse cambiato dopo aver popolato questo file con del testo. Altri metodi che forniscono informazioni sullo spazio su disco sono getTotalSpace e getUsableSpace .

4. Conclusione

In questo tutorial, abbiamo mostrato alcune delle funzionalità fornite dalla classe File per lavorare con file e directory nel file system. .

Come sempre, il codice sorgente completo dell'esempio è disponibile su Github.