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.