Opret et symbolsk link med Java

1. Oversigt

I denne vejledning udforsker vi forskellige måder at oprette et symbolsk link i Java ved hjælp af NIO.2 API og undersøge forskellene mellem hårde og bløde fillinks.

2. Hårde vs bløde / symbolske links

Lad os først definere, hvad fillinks er, og hvad er deres forventede adfærd. Et fillink er en markør, der transparent henviser til en fil, der er gemt i filsystemet.

En almindelig misforståelse er at tro, at et fillink er en genvej, så lad os kontrollere deres adfærd:

  • En genvej er en almindelig fil, der refererer til en målfil
  • Blødt / symbolsk link er en filmarkør, der opfører sig som den fil, der linker til - hvis målfilen bliver slettet, er linket ubrugeligt
  • Et hårdt link er en filmarkør, der afspejler den fil, som den linker til, så det er stort set som en klon. Hvis målfilen bliver slettet, er linkfilen stadig gyldig

De fleste operativsystemer (Linux, Windows, Mac) understøtter allerede bløde / hårde fillinks, så det bør ikke være et problem at arbejde over dem ved hjælp af NIO API.

3. Oprettelse af links

Først skal vi oprette en målfil, der skal linkes til, så lad os rækkefølge nogle data i en fil:

offentlig sti createTextFile () kaster IOException {byte [] indhold = 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, indhold, CREATE, TRUNCATE_EXISTING); returner filPath; } 

Lad os oprette et symbolsk link til en eksisterende fil og sikre, at den oprettede fil er et symbolsk link:

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

Lad os derefter se på en oprettelse af et hårdt link:

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

Ved at liste filerne med deres forskelle kan vi se, at den bløde / symbolske linkfilstørrelse er lille, mens hardlinket bruger den samme plads som den linkede fil:

 48K target_link.txt 48K hard_link.txt 4.0K symboliclink.txt 

For tydeligt at forstå, hvad der er de mulige undtagelser, der kan kastes, lad os se de kontrollerede undtagelser for operationerne:

  • Ikke-understøttetOperationException - når JVM ikke understøtter fillinks i et specifikt system
  • FileAlreadyExistsException - når linkfilen allerede findes, understøttes tilsidesættelsen ikke som standard
  • IOUndtagelse - når der opstår en IO-fejl, f.eks. ugyldig filsti
  • Sikkerhedsundtagelse - når linkfilen ikke kan oprettes, eller der ikke er adgang til målfilen på grund af begrænsede filtilladelser

4. Operationer med links

Hvis vi nu har et givet filsystem med eksisterende fillinks, er det muligt at identificere dem og vise deres målfiler:

offentlig ugyldig printLinkFiles (sti sti) kaster IOException {prøv (DirectoryStream stream = Files.newDirectoryStream (sti)) {for (Sti fil: stream) {hvis (Files.isDirectory (fil)) {printLinkFiles (fil); } ellers hvis (Files.isSymbolicLink (fil)) {System.out.format ("Fillink '% s' med mål '% s'% n", fil, Files.readSymbolicLink (fil)); }}}} 

Hvis vi udfører det på vores nuværende vej:

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

Vi ville få output:

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

Bemærk, at hardlink-filer ikke kun kan identificeres med NIO's API, operationer på lavt niveau kræves for at arbejde over den slags filer.

5. Konklusion

Denne artikel beskriver de forskellige typer fillinks, deres forskel med genveje, og hvordan man opretter og betjener dem ved hjælp af en ren Java API, der fungerer over de almindelige filsystemer på markedet.

Implementeringen af ​​disse eksempler og kodestykker findes på GitHub.