Optionen zum Öffnen von Java-Dateien

1. Übersicht

In diesem Tutorial konzentrieren wir uns auf die Standardoptionen zum Öffnen, die für Dateien in Java verfügbar sind.

Wir werden die StandardOpenOption- Enumeration untersuchen, die die OpenOption- Schnittstelle implementiert und diese Standard-Open-Optionen definiert.

2. Der OpenOption- Parameter

In Java können wir mit Dateien arbeiten, indem wir die NIO2-API verwenden, die mehrere Dienstprogrammmethoden enthält. Einige dieser Methoden verwenden einen optionalen OpenOption- Parameter, mit dem konfiguriert wird, wie eine Datei geöffnet oder erstellt wird. Darüber hinaus hat dieser Parameter einen Standardwert, wenn er nicht festgelegt ist, der für jede dieser Methoden unterschiedlich sein kann.

Der Aufzählungstyp StandardOpenOption definiert die Standardoptionen und implementiert die OpenOption- Schnittstelle.

Hier ist die Liste der unterstützten Optionen, die wir mit der StandardOpenOptions- Enumeration verwenden können:

  • SCHREIBEN : Öffnet die Datei für den Schreibzugriff
  • ANHANG : Hängt einige Daten an die Datei an
  • TRUNCATE_EXISTING : Schneidet die Datei ab
  • CREATE_NEW : Erstellt eine neue Datei und löst eine Ausnahme aus, wenn die Datei bereits vorhanden ist
  • CREATE : Öffnet die Datei, falls vorhanden, oder erstellt eine neue Datei, falls dies nicht der Fall ist
  • DELETE_ON_CLOSE : Löscht die Datei nach dem Schließen des Streams
  • SPARSE : Die neu erstellte Datei ist spärlich
  • SYNC : Erhält den Inhalt und die Metadaten der synchronisierten Datei
  • DSYNC : Erhält nur den Inhalt der synchronisierten Datei

In den nächsten Abschnitten finden Sie Beispiele für die Verwendung der einzelnen Optionen.

Um Verwirrung im Dateipfad zu vermeiden, lassen Sie uns das Basisverzeichnis des Benutzers behandeln, das für alle Betriebssysteme gültig ist:

private static String HOME = System.getProperty("user.home");

3. Öffnen einer Datei zum Lesen und Schreiben

Wenn wir eine neue Datei erstellen möchten , wenn sie nicht vorhanden ist, können wir zunächst die Option CREATE verwenden :

@Test public void givenExistingPath_whenCreateNewFile_thenCorrect() throws IOException { assertFalse(Files.exists(Paths.get(HOME, "newfile.txt"))); Files.write(path, DUMMY_TEXT.getBytes(), StandardOpenOption.CREATE); assertTrue(Files.exists(path)); }

Wir können auch die Option CREATE_NEW verwenden, mit der eine neue Datei erstellt wird, wenn sie nicht vorhanden ist. Es wird jedoch eine Ausnahme ausgelöst, wenn die Datei bereits vorhanden ist.

Zweitens können wir die newInputStream-Methode (Path, OpenOption ...) verwenden , wenn wir die Datei zum Lesen öffnen möchten . Diese Methode öffnet die Datei zum Lesen und gibt einen Eingabestream zurück:

@Test public void givenExistingPath_whenReadExistingFile_thenCorrect() throws IOException { Path path = Paths.get(HOME, DUMMY_FILE_NAME); try (InputStream in = Files.newInputStream(path); BufferedReader reader = new BufferedReader(new InputStreamReader(in))) { String line; while ((line = reader.readLine()) != null) { assertThat(line, CoreMatchers.containsString(DUMMY_TEXT)); } } } 

Beachten Sie, dass wir die Option READ nicht verwendet haben, da sie standardmäßig von der Methode newInputStream verwendet wird .

Drittens können wir mithilfe der Methode newOutputStream (Path, OpenOption ...) eine Datei erstellen, an eine Datei anhängen oder in eine Datei schreiben . Diese Methode öffnet oder erstellt eine Datei zum Schreiben und gibt einen OutputStream zurück .

Die API erstellt eine neue Datei, wenn wir die geöffneten Optionen nicht angeben und die Datei nicht vorhanden ist. Wenn die Datei jedoch vorhanden ist, wird sie abgeschnitten. Diese Option ähnelt dem Aufruf der Methode mit den Optionen CREATE und TRUNCATE_EXISTING .

Öffnen wir eine vorhandene Datei und fügen einige Daten hinzu:

@Test public void givenExistingPath_whenWriteToExistingFile_thenCorrect() throws IOException { Path path = Paths.get(HOME, DUMMY_FILE_NAME); try (OutputStream out = Files.newOutputStream(path, StandardOpenOption.APPEND, StandardOpenOption.WRITE)) { out.write(ANOTHER_DUMMY_TEXT.getBytes()); } }

4. Erstellen einer SPARSE- Datei

Wir können dem Dateisystem mitteilen, dass die neu erstellte Datei spärlich sein sollte (Dateien mit leeren Leerzeichen, die nicht auf die Festplatte geschrieben werden).

Dazu sollten wir die Option SPARSE mit der Option CREATE_NEW verwenden . Diese Option wird jedoch ignoriert, wenn das Dateisystem keine Dateien mit geringer Dichte unterstützt .

Lassen Sie uns eine spärliche Datei erstellen:

@Test public void givenExistingPath_whenCreateSparseFile_thenCorrect() throws IOException { Path path = Paths.get(HOME, "sparse.txt"); Files.write(path, DUMMY_TEXT.getBytes(), StandardOpenOption.CREATE_NEW, StandardOpenOption.SPARSE); }

5. Halten Sie die Datei synchron

Die StandardOpenOptions Enum hat SYNC und DSYNC Optionen. Diese Optionen erfordern, dass Daten synchron in die Datei im Speicher geschrieben werden. Mit anderen Worten, diese garantieren, dass die Daten bei einem Systemabsturz nicht verloren gehen .

Hängen wir einige Daten an unsere Datei an und verwenden die Option SYNC :

@Test public void givenExistingPath_whenWriteAndSync_thenCorrect() throws IOException { Path path = Paths.get(HOME, DUMMY_FILE_NAME); Files.write(path, ANOTHER_DUMMY_TEXT.getBytes(), StandardOpenOption.APPEND, StandardOpenOption.WRITE, StandardOpenOption.SYNC); }

Der Unterschied zwischen SYNC und DSYNC besteht darin, dass SYNC den Inhalt und die Metadaten der Datei synchron im Speicher speichert, während DSYNC nur den Inhalt der Datei synchron im Speicher speichert.

6. Löschen der Datei nach dem Schließen des Streams

Die Aufzählung StandardOpenOptions bietet auch eine nützliche Option, mit der wir die Datei nach dem Schließen des Streams zerstören können. Dies ist nützlich, wenn Sie eine temporäre Datei erstellen möchten.

Fügen wir einige Daten an unsere Datei an und verwenden Sie die Option DELETE_ON_CLOSE :

@Test public void givenExistingPath_whenDeleteOnClose_thenCorrect() throws IOException { Path path = Paths.get(HOME, EXISTING_FILE_NAME); assertTrue(Files.exists(path)); // file was already created and exists try (OutputStream out = Files.newOutputStream(path, StandardOpenOption.APPEND, StandardOpenOption.WRITE, StandardOpenOption.DELETE_ON_CLOSE)) { out.write(ANOTHER_DUMMY_TEXT.getBytes()); } assertFalse(Files.exists(path)); // file is deleted }

7. Fazit

In diesem Tutorial haben wir die verfügbaren Optionen zum Öffnen von Dateien in Java mithilfe der neuen Dateisystem-API (NIO2) behandelt, die als Teil von Java 7 ausgeliefert wurde.

Wie üblich finden Sie den Quellcode mit allen Beispielen im Tutorial auf Github.