Java-bestanden Open Opties

1. Overzicht

In deze tutorial gaan we ons concentreren op de standaard open opties die beschikbaar zijn voor bestanden in Java.

We zullen de StandaardOpenOptie enum dat de OpenOption interface en dat definieert deze standaard open opties.

2. Het OpenOption Parameter

In Java kunnen we met bestanden werken met behulp van de NIO2 API, die verschillende hulpprogramma's bevat. Sommige van deze methoden gebruiken een optioneel OpenOption parameter die configureert hoe een bestand moet worden geopend of gemaakt. Bovendien heeft deze parameter een standaardwaarde als deze niet is ingesteld, die voor elk van deze methoden kan verschillen.

De StandaardOpenOptie enum type definieert de standaard opties en implementeert het OpenOption koppel.

Hier is de lijst met ondersteunde opties die we kunnen gebruiken met de StandardOpenOptions opsomming:

  • SCHRIJVEN: opent het bestand voor schrijftoegang
  • BIJLAGE: voegt enkele gegevens toe aan het bestand
  • TRUNCATE_EXISTING: kapt het bestand af
  • MAAK NIEUW: maakt een nieuw bestand aan en genereert een uitzondering als het bestand al bestaat
  • CREËER: opent het bestand als het bestaat of maakt een nieuw bestand als dat niet het geval is
  • DELETE_ON_CLOSE: verwijdert het bestand na het sluiten van de stream
  • SPARSE: het nieuw gemaakte bestand zal schaars zijn
  • SYNCHRONISEREN: behoudt de inhoud en de metadata van het gesynchroniseerde bestand
  • DSYNC: behoudt alleen de inhoud van het gesynchroniseerde bestand

In de volgende secties zullen we voorbeelden zien van hoe u elk van deze opties kunt gebruiken.

Om verwarring over het bestandspad te voorkomen, gaan we de homedirectory van de gebruiker eens bekijken, die geldig is voor alle besturingssystemen:

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

3. Een bestand openen om te lezen en te schrijven

Ten eerste, als we willen om een ​​nieuw bestand te maken als het nog niet bestaat, kunnen we de optie gebruiken CREËER:

@Test openbare leegte gegevenExistingPath_whenCreateNewFile_thenCorrect () gooit IOException {assertFalse (Files.exists (Paths.get (HOME, "newfile.txt"))); Files.write (pad, DUMMY_TEXT.getBytes (), StandardOpenOption.CREATE); assertTrue (Files.exists (pad)); }

We kunnen ook gebruik maken van de optie MAAK NIEUW, die een nieuw bestand zal aanmaken als het niet bestaat.Het genereert echter een uitzondering als het bestand al bestaat.

Ten tweede, als we willen om het bestand te openen om te lezen kunnen we de newInputStream (Path, OpenOption...) methode. Deze methode opent het bestand om te lezen en retourneert een invoerstroom:

@Test openbare leegte gegevenExistingPath_whenReadExistingFile_thenCorrect () gooit IOException {Path path = Paths.get (HOME, DUMMY_FILE_NAME); probeer (InputStream in = Files.newInputStream (pad); BufferedReader reader = nieuwe BufferedReader (nieuwe InputStreamReader (in))) {String line; while ((line = reader.readLine ())! = null) {assertThat (line, CoreMatchers.containsString (DUMMY_TEXT)); }}} 

Merk op hoe we hebben de optie niet gebruikt LEZEN omdat het standaard door de methode wordt gebruikt newInputStream.

Derde, we kunnen een bestand maken, aan een bestand toevoegen of naar een bestand schrijven met behulp van de newOutputStream (Path, OpenOption...) methode. Deze methode opent of maakt een bestand om te schrijven en retourneert een OutputStream.

De API maakt een nieuw bestand als we de open opties niet specificeren, en het bestand bestaat niet. Als het bestand echter bestaat, wordt het afgekapt. Deze optie is vergelijkbaar met het aanroepen van de methode met de CREËER en TRUNCATE_EXISTING opties.

Laten we een bestaand bestand openen en wat gegevens toevoegen:

@Test openbare ongeldig gegevenExistingPath_whenWriteToExistingFile_thenCorrect () gooit IOException {Path path = Paths.get (HOME, DUMMY_FILE_NAME); probeer (OutputStream out = Files.newOutputStream (pad, StandardOpenOption.APPEND, StandardOpenOption.WRITE)) {out.write (ANOTHER_DUMMY_TEXT.getBytes ()); }}

4. Een SPARSE het dossier

We kunnen het bestandssysteem vertellen dat het nieuw gemaakte bestand dun moet zijn (bestanden met lege spaties die niet naar schijf worden geschreven).

Hiervoor moeten we de optie gebruiken SPARSE met de MAAK NIEUW keuze. Echter, deze optie wordt genegeerd als het bestandssysteem geen sparse bestanden ondersteunt.

Laten we een dun bestand maken:

@Test openbare leegte gegevenExistingPath_whenCreateSparseFile_thenCorrect () gooit IOException {Path path = Paths.get (HOME, "sparse.txt"); Files.write (pad, DUMMY_TEXT.getBytes (), StandardOpenOption.CREATE_NEW, StandardOpenOption.SPARSE); }

5. Het bestand gesynchroniseerd houden

De StandardOpenOptions opsomming heeft SYNCHRONISEREN en DSYNC opties. Deze opties vereisen dat gegevens synchroon in de opslag naar het bestand worden geschreven. Met andere woorden, deze garanderen dat de gegevens niet verloren gaan in het geval van een systeemcrash.

Laten we wat gegevens aan ons bestand toevoegen en de optie gebruiken SYNCHRONISEREN:

@Test openbare ongeldige gegevenExistingPath_whenWriteAndSync_thenCorrect () gooit IOException {Path path = Paths.get (HOME, DUMMY_FILE_NAME); Files.write (pad, ANOTHER_DUMMY_TEXT.getBytes (), StandardOpenOption.APPEND, StandardOpenOption.WRITE, StandardOpenOption.SYNC); }

Het verschil tussen SYNCHRONISEREN en DSYNC is dat SYNCHRONISERENslaat de inhoud en de metadata van het bestand synchroon op in de opslag, terwijl DSYNC slaat alleen de inhoud van het bestand synchroon op in de opslag.

6. Het bestand verwijderen na het sluiten van de stream

De StandardOpenOptions enum biedt ook een handige optie waarmee we het bestand kunnen vernietigen nadat de stream is gesloten. Dit is handig als we een tijdelijk bestand willen maken.

Laten we wat gegevens aan ons bestand toevoegen, en gebruik de optie DELETE_ON_CLOSE:

@Test openbare ongeldig gegevenExistingPath_whenDeleteOnClose_thenCorrect () gooit IOException {Path path = Paths.get (HOME, EXISTING_FILE_NAME); assertTrue (Files.exists (pad)); // bestand is al gemaakt en bestaat probeer (OutputStream out = Files.newOutputStream (pad, StandardOpenOption.APPEND, StandardOpenOption.WRITE, StandardOpenOption.DELETE_ON_CLOSE)) {out.write (ANOTHER_DUMMY_TEXT.getBytes ()); } assertFalse (Files.exists (pad)); // bestand is verwijderd}

7. Conclusie

In deze zelfstudie hebben we de beschikbare opties besproken om bestanden in Java te openen met behulp van de nieuwe bestandssysteem-API (NIO2) die is geleverd als onderdeel van Java 7.

Zoals gewoonlijk is de broncode met alle voorbeelden in de tutorial te vinden op Github.