Opprett en symbolsk lenke med Java

1. Oversikt

I denne opplæringen vil vi utforske forskjellige måter å lage en symbolsk lenke på Java ved hjelp av NIO.2 API, og utforske forskjellene mellom harde og myke fillenker.

2. Hard vs Soft / Symbolic Links

La oss først definere hva fillenker er, og hva er deres forventede oppførsel. En filkobling er en peker som gjennomsiktig refererer til en fil som er lagret i filsystemet.

En vanlig misforståelse er å tenke at en filkobling er en snarvei, så la oss sjekke deres oppførsel:

  • En snarvei er en vanlig fil som refererer til en målfil
  • Myk / symbolsk lenke er en filpeker som oppfører seg som filen som lenker til - hvis målfilen blir slettet, er lenken ubrukelig
  • En hard lenke er en filpeker som speiler filen den kobles til, så den er i utgangspunktet som en klon. Hvis målfilen blir slettet, er koblingsfilen fortsatt gyldig

De fleste operativsystemer (Linux, Windows, Mac) støtter allerede myke / harde fillenker, så det bør ikke være et problem å jobbe med dem ved hjelp av NIO API.

3. Opprette lenker

Først må vi lage en målfil å koble til, så la oss sekvensere noen data i en fil:

offentlig sti createTextFile () kaster IOException {byte [] content = IntStream.range (0, 10000) .mapToObj (i -> i + System.lineSeparator ()) .reduce ("", String :: concat) .getBytes (StandardCharsets .UTF_8); Sti filePath = Paths.get ("", "target_link.txt"); Files.write (filePath, content, CREATE, TRUNCATE_EXISTING); returner filPath; } 

La oss lage en symbolsk lenke til en eksisterende fil, og sørge for at den opprettede filen er en symbolsk lenke:

public void createSymbolicLink () kaster IOException {Path target = createTextFile (); Banelink = Paths.get (".", "Symbolic_link.txt"); hvis (Files.exists (link)) {Files.delete (link); } Files.createSymbolicLink (lenke, mål); } 

Deretter, la oss ta en titt på en oppretting av en hard kobling:

public void createHardLink () kaster IOException {Path target = createTextFile (); Banelink = Paths.get (".", "Hard_link.txt"); hvis (Files.exists (link)) {Files.delete (link); } Files.createLink (lenke, mål); } 

Ved å liste opp filene med forskjellene, kan vi se at den myke / symbolske koblingsfilstørrelsen er liten, mens hardlinken bruker samme plass som den koblede filen:

 48K target_link.txt 48K hard_link.txt 4.0K symbolic_link.txt 

For å forstå tydelig hva som er de mulige unntakene som kan kastes, la oss se de avmerkede unntakene for operasjonene:

  • Ikke-støttetOperationException - når JVM ikke støtter fillenker i et bestemt system
  • FileAlreadyExistsException - når koblingsfilen allerede eksisterer, støttes ikke overstyringen som standard
  • IO Unntak - når det oppstår en IO-feil, f.eks. ugyldig filsti
  • SecurityException - når koblingsfilen ikke kan opprettes eller det ikke er tilgang til målfilen på grunn av begrensede filtillatelser

4. Operasjoner med lenker

Nå, hvis vi har et gitt filsystem med eksisterende fillenker, er det mulig å identifisere dem og vise målfilene:

public void printLinkFiles (Path path) kaster IOException {try (DirectoryStream stream = Files.newDirectoryStream (path)) {for (Path file: stream) {if (Files.isDirectory (file)) {printLinkFiles (file); } annet hvis (Files.isSymbolicLink (fil)) {System.out.format ("Filkobling '% s' med mål '% s'% n", fil, Files.readSymbolicLink (fil)); }}}} 

Hvis vi utfører det i vår nåværende vei:

printLinkFiles (Paths.get (".")); 

Vi ville få utdataene:

Filkobling 'symbolic_link.txt' med mål 'target_link.txt' 

Merk at hardlink-filer ikke bare kan identifiseres med NIOs API, operasjoner på lavt nivå kreves for å jobbe over den typen filer.

5. Konklusjon

Denne artikkelen beskriver den forskjellige typen fillenker, deres forskjell med snarveier, og hvordan du oppretter og opererer over dem ved hjelp av en ren Java API som fungerer over de vanlige filsystemene på markedet.

Implementeringen av disse eksemplene og kodebiter finner du på GitHub.


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