Hozzon létre egy szimbolikus linket a Java-val

1. Áttekintés

Ebben az oktatóanyagban megvizsgáljuk a szimbolikus hivatkozás létrehozásának különböző módjait a Java-ban a NIO.2 API segítségével, és feltárjuk a különbségeket a kemény és a soft fájllinkek között.

2. Hard vs Soft / Symbolic Links

Először határozzuk meg, hogy melyek a fájl linkek, és mi a várható viselkedésük. A fájl link egy mutató, amely átláthatóan hivatkozik a fájlrendszerben tárolt fájlokra.

Gyakori félreértés az a gondolkodás, hogy a fájl link egy parancsikon, ezért ellenőrizzük a viselkedésüket:

  • A parancsikon egy rendes fájl, amely hivatkozik egy célfájlra
  • A Soft / Symbolic link egy fájlmutató, amely a linkelő fájlként viselkedik - ha a célfájl törlődik, a hivatkozás használhatatlan
  • A hard link egy fájlmutató, amely tükrözi a linkelt fájlt, tehát alapvetően olyan, mint egy klón. Ha a célfájl törlődik, a linkfájl továbbra is érvényes

A legtöbb operációs rendszer (Linux, Windows, Mac) már támogatja a soft / hard fájl linkeket, így nem lehet gond, ha a NIO API segítségével dolgozunk rajtuk.

3. Linkek létrehozása

Először létre kell hoznunk egy célfájlt, amelyhez linkelhetjük, ezért szekvenáljunk néhány adatot fájlba:

public Path createTextFile () dobja az IOException {byte [] content = IntStream.range (0, 10000) .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); return filePath; } 

Hozzunk létre egy szimbolikus linket egy meglévő fájlhoz, biztosítva, hogy a létrehozott fájl szimbolikus link legyen:

public void createSymbolicLink () dobja az IOException {Path target = createTextFile (); Path link = Paths.get (".", "Symbolic_link.txt"); if (Fájlok.létezik (link)) {Files.delete (link); } Files.createSymbolicLink (link, cél); } 

Ezután vessünk egy pillantást egy kemény link létrehozására:

public void createHardLink () dobja az IOException-t {Path target = createTextFile (); Path link = Paths.get (".", "Hard_link.txt"); if (Fájlok.létezik (link)) {Files.delete (link); } Files.createLink (link, cél); } 

Ha felsoroljuk a fájlokat a különbségükkel, láthatjuk, hogy a soft / symbolic link fájlmérete kicsi, míg a hard link ugyanazon helyet használja, mint a linkelt fájl:

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

Annak tisztázása érdekében, hogy mik a lehetséges kivételek, amelyek dobhatók, nézzük meg a műveletek bejelölt kivételeit:

  • UnsupportedOperationException - ha a JVM nem támogatja a fájl linkeket egy adott rendszerben
  • FileAlreadyExistsException - ha a linkfájl már létezik, akkor az felülírást alapértelmezés szerint nem támogatják
  • IOException - amikor IO hiba lép fel, pl. érvénytelen fájl elérési útja
  • SecurityException - amikor a linkfájl nem hozható létre, vagy a célfájl nem érhető el korlátozott fájlengedélyek miatt

4. Műveletek linkekkel

Ha van egy adott fájlrendszerünk meglévő fájl linkekkel, akkor azonosítani lehet őket és megmutatni a célfájljaikat:

public void printLinkFiles (Elérési útvonal) az IOException-t dobja {try (DirectoryStream stream = Files.newDirectoryStream (elérési út)) {for (elérési út fájl: stream) {if (Files.isDirectory (fájl)) {printLinkFiles (fájl); } else if (Files.isSymbolicLink (fájl)) {System.out.format ("Fájlhivatkozás '% s' és '% s'% n 'cél, fájl, Files.readSymbolicLink (fájl)); }}}} 

Ha a jelenlegi utunkon hajtjuk végre:

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

Megkapnánk a kimenetet:

A "symbolic_link.txt" fájl link a "target_link.txt" céllal 

Ne feledje, hogy a hard link fájlok nem egyszerűen azonosíthatók NIO API, az ilyen típusú fájlok kezeléséhez alacsony szintű műveletekre van szükség.

5. Következtetés

Ez a cikk leírja a fájltípusok különféle típusait, azok különbségét a parancsikonokkal, valamint azt, hogy miként lehet létrehozni és működtetni őket egy tiszta Java API segítségével, amely a piacon lévő mainstream fájlrendszereken működik.

Ezeknek a példáknak és kódrészleteknek a megvalósítása megtalálható a GitHubon.