Vytvorte symbolické prepojenie s jazykom Java

1. Prehľad

V tomto tutoriáli preskúmame rôzne spôsoby vytvárania symbolického odkazu v Jave pomocou rozhrania NIO.2 API a rozdiely medzi pevnými a mäkkými odkazmi na súbory.

2. Pevné vs mäkké / symbolické odkazy

Najskôr definujme, čo sú odkazy na súbory a aké je ich očakávané správanie. Odkaz na súbor je ukazovateľ, ktorý transparentne odkazuje na súbor uložený v súborovom systéme.

Častým nedorozumením je domnienka, že odkaz na súbor je skratkou, preto skontrolujme jeho správanie:

  • Skratka je obyčajný súbor, ktorý odkazuje na cieľový súbor
  • Mäkký / symbolický odkaz je ukazovateľ súboru, ktorý sa správa ako súbor, na ktorý odkazuje - ak dôjde k odstráneniu cieľového súboru, je odkaz nepoužiteľný
  • Pevný odkaz je ukazovateľ súboru, ktorý zrkadlí súbor, na ktorý odkazuje, takže je v podstate ako klon. Ak sa cieľový súbor odstráni, odkazový súbor je stále platný

Väčšina operačných systémov (Linux, Windows, Mac) už podporuje odkazy na soft / hard súbory, takže by nemal byť problém prepracovať ich pomocou NIO API.

3. Vytváranie odkazov

Najskôr musíme vytvoriť cieľový súbor, na ktorý sa bude odkazovať, takže poďme sekvenovať niektoré údaje do súboru:

public Path createTextFile () hodí IOException {byte [] obsah = IntStream.range (0, 10 000) .mapToObj (i -> i + System.lineSeparator ()) .reduce ("", String :: concat) .getBytes (StandardCharsets .UTF_8); Path filePath = Paths.get ("", "target_link.txt"); Files.write (filePath, content, CREATE, TRUNCATE_EXISTING); návrat filePath; } 

Vytvorme symbolický odkaz na existujúci súbor a zabezpečme, aby bol vytvorený súbor symbolickým odkazom:

public void createSymbolicLink () vyvolá IOException {cieľ cesty = createTextFile (); Odkaz na cestu = Paths.get (".", "Symbolic_link.txt"); if (Files.exists (link)) {Files.delete (link); } Files.createSymbolicLink (odkaz, cieľ); } 

Ďalej sa pozrime na vytvorenie pevného odkazu:

public void createHardLink () vyvolá IOException {cieľ cesty = createTextFile (); Odkaz na cestu = Paths.get (".", "Hard_link.txt"); if (Files.exists (link)) {Files.delete (link); } Files.createLink (odkaz, cieľ); } 

Ak uvedieme zoznam súborov s ich rozdielmi, zistíme, že veľkosť súboru prepojeného / symbolického odkazu je malá, zatiaľ čo pevný odkaz využíva rovnaké miesto ako prepojený súbor:

 48 kB target_link.txt 48 kB hard_link.txt 4,0 tis. Symbolic_link.txt 

Aby sme jasne pochopili, aké sú možné výnimky, ktoré sa dajú hodiť, pozrime sa na zaškrtnuté výnimky v operáciách:

  • UnsupportedOperationException - keď JVM nepodporuje odkazy na súbory v konkrétnom systéme
  • FileAlreadyExistsException - ak súbor odkazu už existuje, prepísanie nie je predvolene podporované
  • Výnimka IO - keď dôjde k chybe IO, napr. neplatná cesta k súboru
  • Výnimka zabezpečenia - keď nie je možné vytvoriť odkazový súbor alebo nie je možné získať prístup k cieľovému súboru z dôvodu obmedzených povolení súboru

4. Operácie s odkazmi

Teraz, ak máme daný súborový systém s existujúcimi odkazmi na súbory, je možné ich identifikovať a zobraziť ich cieľové súbory:

public void printLinkFiles (cesta cesty) vyvolá IOException {try (DirectoryStream stream = Files.newDirectoryStream (cesta)) {pre (cesta súboru: prúd) {if (Files.isDirectory (súbor)) {printLinkFiles (súbor); } else if (Files.isSymbolicLink (súbor)) {System.out.format ("Odkaz na súbor '% s' s cieľom '% s'% n", súbor, Files.readSymbolicLink (súbor)); }}}} 

Ak to vykonáme na našej súčasnej ceste:

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

Dostali by sme výstup:

Odkaz na súbor „symbolic_link.txt“ s cieľom „target_link.txt“ 

Upozorňujeme, že súbory pevných odkazov nie je možné jednoducho identifikovať API NIONa prácu s týmto typom súborov sú potrebné operácie na nízkej úrovni.

5. Záver

Tento článok popisuje rôzne typy odkazov na súbory, ich odlišnosť od skratiek a spôsob ich vytvárania a prevádzkovania pomocou čistého rozhrania Java API, ktoré funguje v bežných súborových systémoch na trhu.

Implementáciu týchto príkladov a útržkov kódu nájdete na GitHub.


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