Stvorite simboličku vezu s Javom

1. Pregled

U ovom ćemo uputstvu istražiti različite načine stvaranja simboličke veze u Javi pomoću NIO.2 API-ja i istražiti razlike između tvrdih i mekih veza datoteka.

2. Tvrdi vs meki / simbolički linkovi

Prvo definirajmo što su poveznice datoteka i kakvo je njihovo očekivano ponašanje. Link datoteke je pokazivač koji transparentno upućuje na datoteku pohranjenu u datotečnom sustavu.

Uobičajeni nesporazum je mišljenje da je veza do datoteke prečac, pa provjerimo njihovo ponašanje:

  • Prečac je uobičajena datoteka koja upućuje na ciljnu datoteku
  • Mekana / simbolična veza je pokazivač datoteke koji se ponaša kao datoteka na koju se povezuje - ako se ciljna datoteka izbriše, tada je veza neupotrebljiva
  • Tvrda veza je pokazivač na datoteku koji zrcali datoteku na koju se veže, pa je u osnovi poput klona. Ako se ciljna datoteka izbriše, datoteka veze još uvijek vrijedi

Većina operativnih sustava (Linux, Windows, Mac) već podržava meke / tvrde veze datoteka, pa ne bi trebao predstavljati problem raditi s njima pomoću NIO API-ja.

3. Stvaranje poveznica

Prvo, moramo stvoriti ciljanu datoteku na koju ćemo se povezati, pa sljedimo neke podatke u datoteku:

public Path createTextFile () baca IOException {byte [] content = IntStream.range (0, 10000) .mapToObj (i -> i + System.lineSeparator ()) .reduce ("", String :: concat) .getBytes (StandardCharsets .UTF_8); Put datotekaPath = Paths.get ("", "target_link.txt"); Files.write (filePath, content, CREATE, TRUNCATE_EXISTING); vratiti filePath; } 

Stvorimo simboličku vezu do postojeće datoteke, osiguravajući da stvorena datoteka predstavlja simboličku vezu:

javna praznina createSymbolicLink () baca IOException {Cilj puta = createTextFile (); Veza do puta = Paths.get (".", "Symbolic_link.txt"); if (Files.exists (link)) {Files.delete (link); } Files.createSymbolicLink (veza, cilj); } 

Dalje, pogledajmo stvaranje tvrde veze:

javna praznina createHardLink () baca IOException {Cilj puta = createTextFile (); Veza do puta = Paths.get (".", "Hard_link.txt"); if (Files.exists (link)) {Files.delete (link); } Files.createLink (veza, cilj); } 

Popisom datoteka s njihovim razlikama možemo vidjeti da je veličina datoteke mekog / simboličkog povezivanja mala, dok tvrda veza koristi isti prostor kao i povezana datoteka:

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

Da bismo jasno razumjeli koje su moguće iznimke koje se mogu baciti, pogledajmo provjerene iznimke na operacijama:

  • UnsupportedOperationException - kada JVM ne podržava veze datoteka u određenom sustavu
  • FileAlreadyExistsException - kada datoteka veze već postoji, poništavanje nije podržano prema zadanim postavkama
  • IOException - kada se dogodi IO pogreška, npr. nevažeća staza datoteke
  • SecurityException - kada se datoteka veza ne može stvoriti ili se ne može pristupiti ciljanoj datoteci zbog ograničenih dozvola datoteke

4. Operacije s vezama

Sada, ako imamo zadani datotečni sustav s postojećim vezama datoteka, moguće ih je identificirati i prikazati ciljne datoteke:

javna praznina printLinkFiles (Staza puta) baca IOException {try (DirectoryStream stream = Files.newDirectoryStream (path)) {for (Path file: stream) {if (Files.isDirectory (datoteka)) {printLinkFiles (datoteka); } else if (Files.isSymbolicLink (datoteka)) {System.out.format ("Link datoteke '% s' s ciljem '% s'% n", datoteka, Files.readSymbolicLink (datoteka)); }}}} 

Ako ga izvršimo na našem trenutnom putu:

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

Dobili bismo izlaz:

Veza datoteke "symbolic_link.txt" s ciljem "target_link.txt" 

Imajte na umu da se datoteke s čvrstim vezama ne mogu jednostavno identificirati NIO-ov API, operacije niske razine potrebne su za rad na toj vrsti datoteka.

5. Zaključak

Ovaj članak opisuje različite vrste veza do datoteka, njihovu razliku s prečacima i kako ih stvoriti i upravljati njima koristeći čisti Java API koji radi na glavnim sustavima datoteka na tržištu.

Implementacija ovih primjera i isječaka koda može se naći na GitHubu.


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