Java-filer Åbn indstillinger

1. Oversigt

I denne vejledning vil vi fokusere på de åbne standardindstillinger, der er tilgængelige for filer i Java.

Vi udforsker StandardOpenOption enum, der implementerer OpenOption interface og der defineres disse standard åbne muligheder.

2. Den OpenOption Parameter

I Java kan vi arbejde med filer ved hjælp af NIO2 API, som indeholder flere hjælpemetoder. Nogle af disse metoder bruger en valgfri OpenOption parameter, der konfigurerer, hvordan man åbner eller opretter en fil. Derudover har denne parameter en standardværdi, hvis den ikke er indstillet, som kan være forskellig for hver af disse metoder.

Det StandardOpenOption enum type definerer standardindstillingerne og implementerer OpenOption interface.

Her er listen over understøttede muligheder, vi kan bruge med StandardOpenOptions enum:

  • SKRIVE: åbner filen for skriveadgang
  • TILFØJ: tilføjer nogle data til filen
  • TRUNCATE_EXISTING: trunkerer filen
  • LAV NY: opretter en ny fil og kaster en undtagelse, hvis filen allerede findes
  • SKAB: åbner filen, hvis den findes, eller opretter en ny fil, hvis den ikke findes
  • DELETE_ON_CLOSE: sletter filen efter lukning af streamen
  • SPARSE: den nyoprettede fil vil være sparsom
  • SYNKRONISERE: bevarer indholdet og metadataene for den synkroniserede fil
  • DSYNC: bevarer kun indholdet af den synkroniserede fil

I de næste sektioner ser vi eksempler på, hvordan du bruger hver af disse muligheder.

For at undgå enhver forvirring i filstien, lad os få fat i brugerens hjemmekatalog, som er gyldig på tværs af alle operativsystemer:

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

3. Åbning af en fil til læsning og skrivning

Først hvis vi vil for at oprette en ny fil, hvis den ikke findes, kan vi bruge indstillingen SKAB:

@Test offentligt ugyldigt givetExistingPath_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å bruge indstillingen LAV NY, som opretter en ny fil, hvis den ikke findes.Det kaster dog en undtagelse, hvis filen allerede findes.

For det andet, hvis vi vil for at åbne filen til læsning kan vi bruge newInputStream (sti, OpenOption...) metode. Denne metode åbner filen til læsning og returnerer en inputstrøm:

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

Læg mærke til hvordan vi brugte ikke indstillingen LÆS fordi det bruges som standard ved metoden newInputStream.

Tredje, vi kan oprette en fil, føje til en fil eller skrive til en fil ved hjælp af newOutputStream (sti, OpenOption...) metode. Denne metode åbner eller opretter en fil til skrivning og returnerer en OutputStream.

API'en opretter en ny fil, hvis vi ikke angiver de åbne muligheder, og filen ikke findes. Men hvis filen findes, bliver den afkortet. Denne mulighed svarer til at kalde metoden med SKAB og TRUNCATE_EXISTING muligheder.

Lad os åbne en eksisterende fil og tilføje nogle data:

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

4. Oprettelse af en SPARSE Fil

Vi kan fortælle filsystemet, at den nyoprettede fil skal være sparsom (filer, der indeholder tomme mellemrum, der ikke skrives til disken).

Til dette skal vi bruge muligheden SPARSE med LAV NY mulighed. Imidlertid, denne mulighed ignoreres, hvis filsystemet ikke understøtter sparsomme filer.

Lad os oprette en sparsom fil:

@Test offentlig ugyldighed givetExistingPath_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 synkroniseret

Det StandardOpenOptions enum har SYNKRONISERE og DSYNC muligheder. Disse muligheder kræver, at data skrives til filen synkront i lageret. Med andre ord, disse garanterer, at dataene ikke går tabt i tilfælde af et systemnedbrud.

Lad os tilføje nogle data til vores fil og bruge indstillingen SYNKRONISERE:

@Test offentlig ugyldighed givenExistingPath_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); }

Forskellen på SYNKRONISERE og DSYNC er det SYNKRONISEREgemmer indholdet og metadataene for filen synkront i lageret, mens DSYNC gemmer kun indholdet af filen synkront i lageret.

6. Sletning af filen efter lukning af streamen

Det StandardOpenOptions enum tilbyder også en nyttig mulighed, der giver os muligheden for at ødelægge filen efter lukning af streamen. Dette er nyttigt, hvis vi vil oprette en midlertidig fil.

Lad os tilføje nogle data til vores fil, og Brug indstillingen DELETE_ON_CLOSE:

@Test offentlig ugyldighed givenExistingPath_whenDeleteOnClose_thenCorrect () kaster IOException {Path path = Paths.get (HJEM, EXISTING_FILE_NAME); assertTrue (Files.exists (sti)); // filen blev allerede oprettet og eksisterer prøv (OutputStream out = Files.newOutputStream (sti, StandardOpenOption.APPEND, StandardOpenOption.WRITE, StandardOpenOption.DELETE_ON_CLOSE)) {out.write (ANOTHER_DUMMY_TEXT.getBytes ()); } assertFalse (Files.exists (sti)); // fil slettes}

7. Konklusion

I denne vejledning dækkede vi de tilgængelige muligheder for at åbne filer i Java ved hjælp af det nye filsystem API (NIO2), der blev sendt som en del af Java 7.

Som normalt kan kildekoden med alle eksemplerne i vejledningen findes på Github.


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