Java-filer Åpne alternativer

1. Oversikt

I denne opplæringen vil vi fokusere på de standard åpne alternativene som er tilgjengelige for filer i Java.

Vi skal utforske StandardOpenOption enum som implementerer OpenOption grensesnitt og som definerer disse standard åpne alternativene.

2. Den OpenOption Parameter

I Java kan vi jobbe med filer ved hjelp av NIO2 API, som inneholder flere verktøymetoder. Noen av disse metodene bruker en valgfri OpenOption parameter som konfigurerer hvordan du åpner eller oppretter en fil. I tillegg vil denne parameteren ha en standardverdi hvis den ikke er angitt, som kan være forskjellig for hver av disse metodene.

De StandardOpenOption enum type definerer standardalternativene og implementerer OpenOption grensesnitt.

Her er listen over støttede alternativer vi kan bruke med StandardOpenOptions enum:

  • SKRIVE: åpner filen for skrivetilgang
  • LEGG TIL: legger til noen data i filen
  • TRUNCATE_EXISTING: avkorter filen
  • LAG NY: oppretter en ny fil og kaster et unntak hvis filen allerede eksisterer
  • SKAPE: åpner filen hvis den eksisterer, eller oppretter en ny fil hvis den ikke gjør det
  • DELETE_ON_CLOSE: sletter filen etter å ha lukket strømmen
  • SPARSE: den nyopprettede filen vil være sparsom
  • SYNKRONISERING: bevarer innholdet og metadataene til filen som er synkronisert
  • DSYNC: bevarer bare innholdet i filen som er synkronisert

I de neste avsnittene ser vi eksempler på hvordan du bruker hvert av disse alternativene.

For å unngå forvirring i filstien, la oss ta hånd om hjemmekatalogen til brukeren, som vil være gyldig i alle operativsystemer:

privat statisk streng HOME = System.getProperty ("user.home");

3. Åpne en fil for lesing og skriving

Først hvis vi vil for å opprette en ny fil hvis den ikke eksisterer kan vi bruke alternativet SKAPE:

@Test offentlig ugyldighet gittExistingPath_whenCreateNewFile_thenCorrect () kaster IOException {assertFalse (Files.exists (Paths.get (HJEM, "newfile.txt"))); Files.write (sti, DUMMY_TEXT.getBytes (), StandardOpenOption.CREATE); assertTrue (Files.exists (sti)); }

Vi kan også bruke alternativet LAG NY, som vil opprette en ny fil hvis den ikke eksisterer.Det vil imidlertid kaste et unntak hvis filen allerede eksisterer.

For det andre, hvis vi vil for å åpne filen for lesing kan vi bruke newInputStream (bane, OpenOption...) metode. Denne metoden åpner filen for lesing og returnerer en inngangsstrøm:

@Test offentlig ugyldighet gittExistingPath_whenReadExistingFile_thenCorrect () kaster IOException {Path path = Paths.get (HJEM, DUMMY_FILE_NAME); prøv (InputStream in = Files.newInputStream (sti); BufferedReader-leser = ny BufferedReader (ny InputStreamReader (i))) {Strenglinje; mens ((line = reader.readLine ())! = null) {assertThat (line, CoreMatchers.containsString (DUMMY_TEXT)); }}} 

Legg merke til hvordan vi brukte ikke alternativet LESE fordi den brukes som standard etter metoden newInputStream.

Tredje, vi kan opprette en fil, legge til en fil eller skrive til en fil ved hjelp av newOutputStream (bane, OpenOption...) metode. Denne metoden åpner eller oppretter en fil for skriving og returnerer en OutputStream.

API-et vil opprette en ny fil hvis vi ikke spesifiserer de åpne alternativene, og filen ikke eksisterer. Imidlertid, hvis filen eksisterer, blir den avkortet. Dette alternativet ligner på å kalle metoden med SKAPE og TRUNCATE_EXISTING alternativer.

La oss åpne en eksisterende fil og legge til noen data:

@Test offentlig ugyldig gittExistingPath_whenWriteToExistingFile_thenCorrect () kaster IOException {Path path = Paths.get (HJEM, DUMMY_FILE_NAME); prøv (OutputStream ut = Files.newOutputStream (bane, StandardOpenOption.APPEND, StandardOpenOption.WRITE)) {out.write (ANOTHER_DUMMY_TEXT.getBytes ()); }}

4. Opprette en SPARSE Fil

Vi kan fortelle filsystemet at den nyopprettede filen skal være sparsom (filer som inneholder tomme mellomrom som ikke blir skrevet til disken).

For dette bør vi bruke alternativet SPARSE med LAG NY alternativ. Derimot, dette alternativet blir ignorert hvis filsystemet ikke støtter sparsomme filer.

La oss lage en sparsom fil:

@Test offentlig ugyldighet gittExistingPath_whenCreateSparseFile_thenCorrect () kaster IOException {Path path = Paths.get (HJEM, "sparse.txt"); Files.write (sti, DUMMY_TEXT.getBytes (), StandardOpenOption.CREATE_NEW, StandardOpenOption.SPARSE); }

5. Holde filen synkronisert

De StandardOpenOptions enum har SYNKRONISERING og DSYNC alternativer. Disse alternativene krever at data skrives til filen synkront i lagringen. Med andre ord, disse vil garantere at dataene ikke går tapt i tilfelle et systemkrasj.

La oss legge til noen data i filen vår og bruke alternativet SYNKRONISERING:

@Test offentlig ugyldig gittExistingPath_whenWriteAndSync_thenCorrect () kaster IOException {Path path = Paths.get (HJEM, DUMMY_FILE_NAME); Files.write (sti, ANOTHER_DUMMY_TEXT.getBytes (), StandardOpenOption.APPEND, StandardOpenOption.WRITE, StandardOpenOption.SYNC); }

Forskjellen mellom SYNKRONISERING og DSYNC er det SYNKRONISERINGlagrer innholdet og metadataene til filen synkront i lagringen, mens DSYNC lagrer bare innholdet i filen synkront i lageret.

6. Slette filen etter at Stream er avsluttet

De StandardOpenOptions enum tilbyr også et nyttig alternativ som gir oss muligheten til å ødelegge filen etter å ha lukket strømmen. Dette er nyttig hvis vi vil opprette en midlertidig fil.

La oss legge til noen data i filen vår, og bruk alternativet DELETE_ON_CLOSE:

@Test offentlig ugyldig gittExistingPath_whenDeleteOnClose_thenCorrect () kaster IOException {Path path = Paths.get (HJEM, EXISTING_FILE_NAME); assertTrue (Files.exists (sti)); // filen var allerede opprettet og eksisterer prøv (OutputStream ut = Files.newOutputStream (bane, StandardOpenOption.APPEND, StandardOpenOption.WRITE, StandardOpenOption.DELETE_ON_CLOSE)) {out.write (ANOTHER_DUMMY_TEXT.getBytes ()); } assertFalse (Files.exists (sti)); // filen er slettet}

7. Konklusjon

I denne opplæringen dekket vi de tilgjengelige alternativene for å åpne filer i Java ved hjelp av det nye filsystemet API (NIO2) som ble sendt som en del av Java 7.

Som vanlig kan kildekoden med alle eksemplene i opplæringen bli funnet på Github.


$config[zx-auto] not found$config[zx-overlay] not found