Die Java-Dateiklasse

1. Übersicht

In diesem Tutorial geben wir einen Überblick über die File- Klasse, die Teil der java.io- API ist. Mit der File- Klasse können wir mit Dateien und Verzeichnissen im Dateisystem arbeiten .

2. Erstellen einer Datei - Objekt

Die File- Klasse verfügt über 4 öffentliche Konstruktoren. Abhängig von den Anforderungen des Entwicklers können verschiedene Arten von Instanzen der File- Klasse erstellt werden.

  • Datei (String-Pfadname) - Erstellt eine Instanz, die den angegebenen Pfadnamen darstellt
  • Datei (String Elternteil, String child) - erstellt eine Instanz, die den Weg durch Verbinden des gebildeten repräsentiert Elternteil und das Kind Pfade
  • Datei (Datei übergeordnet, Zeichenfolge untergeordnet) - Erstellt eine Instanz mit dem Pfad, der durch Verbinden des übergeordneten Pfads, der durch eine andere Dateiinstanz dargestellt wird, und des untergeordneten Pfads gebildet wird
  • Datei (URI uri) - Erstellt eine Instanz, die den angegebenen Uniform Resource Identifier darstellt

3. Arbeiten mit dem Datei - Klasse

Die File- Klasse verfügt über eine Reihe von Methoden, mit denen wir Dateien im Dateisystem bearbeiten und bearbeiten können. Wir werden einige davon hier hervorheben. Es ist wichtig zu beachten, dass die File- Klasse den Inhalt der von ihr dargestellten Datei nicht ändern oder darauf zugreifen kann.

3.1. Verzeichnisse und Dateien erstellen und löschen

Die File- Klasse verfügt über Instanzmethoden zum Erstellen und Löschen von Verzeichnissen und Dateien. Verzeichnisse und Dateien werden mit den Methoden mkdir bzw. createNewFile erstellt .

Verzeichnisse und Dateien werden mit der gelöschten Löschmethode . Alle diese Methoden geben einen booleschen Wert zurück, der wahr ist , wenn die Operation erfolgreich ist, und andernfalls falsch :

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

Im obigen Ausschnitt sehen wir auch andere hilfreiche Methoden .

Mit der isDirectory- Methode kann getestet werden, ob die durch den angegebenen Namen angegebene Datei ein Verzeichnis ist, während mit der isFile- Methode getestet werden kann, ob die mit dem angegebenen Namen angegebene Datei eine Datei ist. Und wir können die existierende Methode verwenden , um zu testen, ob ein Verzeichnis oder eine Datei bereits auf dem System existiert.

3.2. Abrufen von Metadaten zu Dateiinstanzen

Die File- Klasse verfügt über eine Reihe von Methoden, die Metadaten zu File- Instanzen zurückgeben. Lassen Sie uns sehen, wie die Methoden getName, getParentFile und getPath verwendet werden :

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

Hier haben wir die Validierung der Metadaten zu der Datei veranschaulicht, die im Verzeichnis erstellt wurde. Wir haben auch gezeigt, wie Sie das übergeordnete Element der Datei und den relativen Pfad zu dieser Datei finden.

3.3. Festlegen von Datei- und Verzeichnisberechtigungen

Die File- Klasse verfügt über Methoden, mit denen Sie Berechtigungen für eine Datei oder ein Verzeichnis festlegen können. Hier sehen wir uns setWritable und setReadable anMethoden :

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

Im obigen Code versuchen wir, in eine Datei zu schreiben, nachdem wir explizit Berechtigungen festgelegt haben, die alle Schreibvorgänge blockieren. Wir machen das mit der setWritable- Methode. Der Versuch, beim Schreiben in die Datei in eine Datei zu schreiben, ist nicht zulässig. Dies führt dazu, dass eine IOException ausgelöst wird.

Als Nächstes versuchen wir, aus einer Datei zu lesen, nachdem wir Berechtigungen festgelegt haben, die alle Lesevorgänge blockieren. Lesevorgänge werden mit der setReadable- Methode blockiert :

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

Auch hier wird die JVM eine wirft IOException für Versuche , eine Datei zu lesen , wo liest sind nicht gestattet .

3.4. Auflisten von Dateien in einem Verzeichnis

Die File- Klasse verfügt über Methoden, mit denen wir in einem Verzeichnis enthaltene Dateien auflisten können. Ebenso können Verzeichnisse aufgelistet werden. Hier sehen wir uns die Methoden list und list (FilenameFilter) an :

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

Wir haben ein Verzeichnis erstellt und zwei Dateien hinzugefügt - eine mit der Erweiterung csv und die andere mit der Erweiterung txt . Wenn wir alle Dateien im Verzeichnis auflisten, erhalten wir erwartungsgemäß zwei Dateien. Wenn wir die Liste filtern, indem wir nach Dateien mit einer CSV- Erweiterung filtern , wird nur eine Datei zurückgegeben.

3.5. Umbenennen von Dateien und Verzeichnissen

Die File- Klasse bietet die Funktionalität, Dateien und Verzeichnisse mithilfe der renameTo- Methode umzubenennen :

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

Im obigen Beispiel erstellen wir zwei Verzeichnisse - das Quell- und das Zielverzeichnis. Anschließend benennen wir das Quellverzeichnis mit der Methode renameTo in das Zielverzeichnis um . Das gleiche kann verwendet werden, um Dateien anstelle von Verzeichnissen umzubenennen.

3.6. Informationen zum Speicherplatz abrufen

Mit der File- Klasse können wir auch Informationen zum Speicherplatz abrufen. Sehen wir uns eine Demonstration der getFreeSpace- Methode an :

@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 diesem Beispiel haben wir ein Verzeichnis im Home-Verzeichnis des Benutzers erstellt und anschließend eine Datei darin erstellt. Wir haben dann überprüft, ob sich der freie Speicherplatz auf der Home-Verzeichnis-Partition geändert hat, nachdem diese Datei mit Text gefüllt wurde. Andere Methoden, die Informationen zum Speicherplatz liefern, sind getTotalSpace und getUsableSpace .

4. Fazit

In diesem Tutorial haben wir einige der Funktionen gezeigt, die die File- Klasse für die Arbeit mit Dateien und Verzeichnissen im Dateisystem bietet. .

Wie immer ist der vollständige Quellcode des Beispiels auf Github verfügbar.