Sobes.tech
Junior

Čo je symbolický odkaz?

sobes.tech AI

Odpoveď od AI

Symbolický odkaz (symbolic link alebo symlink) je špeciálny typ súboru v operačnom systéme, ktorý odkazuje na iný súbor alebo adresár. Funguje ako skratka.

Kľúčové vlastnosti:

  • Obsahuje cestu: Symbolický odkaz obsahuje textový reťazec — cestu k cieľovému súboru alebo adresáru. Pri prístupe k odkazu systém nasleduje túto cestu.
  • Neobsahuje dáta: Samotný odkaz neobsahuje dáta cieľového súboru. Veľkosť odkazu je zvyčajne malá a závisí od dĺžky cesty.
  • Nezávislosť od oddielu: Cieľový súbor alebo adresár môže byť na inom disku alebo dokonca súborovom systéme, odlišnom od samotného odkazu.
  • Zlomené odkazy: Ak je cieľový súbor alebo adresár vymazaný, symbolický odkaz sa stáva "zlomeným" (broken) alebo "visiacim" (dangling), ale samotný odkaz naďalej existuje.
  • Podpora: Podporovaný je väčšinou moderných operačných systémov (Linux, macOS, Windows s NTFS).

Porovnanie so pevným odkazom (hard link):

Kritérium Symbolický odkaz Pevný odkaz
Typ súboru Samostatný typ súboru Dodatočný odkaz na inode
Cesta Uchováva cestu k cieľu Neuchováva cestu
Oddiel/FS Môže odkazovať na iný oddiel/FS Musí byť na tom istom oddieli/FS
Vymazanie cieľa Odkaz sa stáva zlomeným Dáta sú dostupné cez iné odkazy
Na adresáre Môže odkazovať na adresáre Zvyčajne nemôže odkazovať na adresáre

V Jave sa práca so symbolickými odkazmi realizuje cez API java.nio.file.

// Príklad vytvorenia symbolického odkazu
import java.io.IOException;
import java.nio.file.*;

public class SymlinkExample {

    public static void main(String[] args) {
        Path target = Paths.get("target_file.txt"); // Cieľový súbor
        Path link = Paths.get("mylink_to_target"); // Názov symbolického odkazu

        try {
            // Vytvorenie cieľového súboru (pre príklad)
            Files.write(target, "Hello, World!".getBytes());

            // Vytvorenie symbolického odkazu
            Files.createSymbolicLink(link, target);
            System.out.println("Symbolický odkaz vytvorený: " + link.toAbsolutePath());

            // Kontrola, či je cesta symbolický odkaz
            System.out.println(link.getFileName() + " je symbolický odkaz: " + Files.isSymbolicLink(link));

            // Čítanie obsahu cez odkaz
            byte[] content = Files.readAllBytes(link);
            System.out.println("Obsah cez odkaz: " + new String(content));

            // Rozlíšenie odkazu na cieľovú cestu
             Path resolvedTarget = Files.readSymbolicLink(link);
             System.out.println("Cieľová cesta odkazu: " + resolvedTarget);

        } catch (IOException e) {
            e.printStackTrace();
         } finally {
             // Vymazanie vytvorených súborov pre čistenie
             try {
                 Files.deleteIfExists(link);
                 Files.deleteIfExists(target);
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
    }
}