Oprettelse af midlertidige mapper i Java

1. Oversigt

Midlertidige mapper er nyttige, når vi har brug for at oprette et sæt filer, som vi senere kan kassere. Når vi opretter midlertidige mapper, kan vi delegere til operativsystemet, hvor de skal placeres, eller angive, hvor vi vil placere dem.

I denne korte vejledning lærer vi hvordan man opretter midlertidige mapper i Java ved hjælp af forskellige API'er og tilgange. Alle eksemplerne i denne vejledning udføres ved hjælp af almindelig Java 7+, Guava og Apache Commons IO.

2. Delegere til operativsystemet

En af de mest populære tilgange, der bruges til at oprette midlertidige mapper, er at delegere destinationen til det underliggende operativsystem. Placeringen er givet af java.io.tmpdir ejendom, og hvert operativsystem har sin egen struktur og oprydningsrutiner.

I almindelig Java opretter vi en mappe ved at angive det præfiks, vi ønsker, at biblioteket skal tage:

String tmpdir = Files.createTempDirectory ("tmpDirPrefix"). ToFile (). GetAbsolutePath (); Streng tmpDirsLocation = System.getProperty ("java.io.tmpdir"); assertThat (tmpdir). starter med (tmpDirsLocation);

Ved hjælp af Guava er processen ens, men vi kan ikke specificere, hvordan vi vil prefikse vores bibliotek:

String tmpdir = Files.createTempDir (). GetAbsolutePath (); Streng tmpDirsLocation = System.getProperty ("java.io.tmpdir"); assertThat (tmpdir). starter med (tmpDirsLocation);

Apache Commons IO giver ikke en måde at oprette midlertidige mapper på. Det giver en indpakning for at få operativsystemets midlertidige bibliotek, og derefter er det op til os at gøre resten:

Streng tmpDirsLocation = System.getProperty ("java.io.tmpdir"); Sti sti = Paths.get (FileUtils.getTempDirectory (). GetAbsolutePath (), UUID.randomUUID (). ToString ()); String tmpdir = Files.createDirectories (sti) .toFile (). GetAbsolutePath (); assertThat (tmpdir). starter med (tmpDirsLocation);

For at undgå navnekollisioner med eksisterende mapper bruger vi UUID.randomUUID () for at oprette en mappe med et tilfældigt navn.

3. Angivelse af placeringen

Nogle gange skal vi angive, hvor vi vil oprette vores midlertidige bibliotek. Et godt eksempel er under en Maven-build. Da vi allerede har en "midlertidig" build mål katalog, kan vi bruge denne mappe til at placere midlertidige mapper, som vores build muligvis har brug for:

Sti tmpdir = Files.createTempDirectory (Paths.get ("target"), "tmpDirPrefix"); assertThat (tmpdir.toFile (). getPath ()). startsWith ("target");

Både Guava og Apache Commons IO mangler metoder til at oprette midlertidige mapper på bestemte placeringer.

Det er værd at bemærke det det mål biblioteket kan være forskelligt afhængigt af buildkonfigurationen. En måde at gøre det skudsikker på er at sende målkatalogplaceringen til den JVM, der kører testen.

Da operativsystemet ikke tager sig af oprydningen, kan vi gøre brug af det File.deleteOnExit ():

tmpdir.toFile (). deleteOnExit ();

Denne måde, filen slettes, når JVM er afsluttet, men kun hvis opsigelsen er yndefuld.

4. Brug af forskellige filattributter

Som enhver anden fil eller mappe er det muligt at specificere filattributter ved oprettelsen af ​​en midlertidig mappe. Så hvis vi ønsker at oprette en midlertidig mappe, der kun kan læses af den bruger, der opretter den, kan vi specificere det sæt attributter, der vil opnå det:

FileAttribute attrs = PosixFilePermissions.asFileAttribute (PosixFilePermissions.fromString ("r --------")); Sti tmpdir = Files.createTempDirectory (Paths.get ("target"), "tmpDirPrefix", attrs); assertThat (tmpdir.toFile (). getPath ()). startsWith ("target"); assertThat (tmpdir.toFile (). canWrite ()). isFalse ();

Som forventet giver Guava og Apache Commons IO ikke en måde at specificere attributterne ved oprettelse af midlertidige mapper.

Det er også værd at bemærke, at det foregående eksempel antager, at vi er under et Posix-kompatibelt filsystem som Unix eller macOS.

Flere oplysninger om filattributter findes i vores guide til NIO2-filattribut-API'er.

5. Konklusion

I denne korte vejledning undersøgte vi, hvordan man opretter midlertidige mapper i almindelig Java 7+, Guava og Apache Commons IO. Vi så, at almindelig Java er den mest fleksible måde at oprette midlertidige mapper på, da det giver en bredere vifte af muligheder, samtidig med at ordligheden holdes på et minimum.

Som normalt er al kildekoden til denne tutorial tilgængelig på GitHub.