Sobes.tech
Junior

Mis on sümboliline link?

sobes.tech AI

Vastus AI-lt

Symbolic link (symbolic link või symlink) on spetsiaalne failitüüp operatsioonisüsteemis, mis viitab teisele failile või kaustale. See toimib nagu otsetee.

Põhijooned:

  • Sisu: Symbolic link sisaldab tekstijada — teed sihtfailile või kaustale. Failile või kaustale juurdepääsul järgib süsteem seda teed.
  • Andmed puuduvad: Sildil endal ei ole sihtfaili andmeid. Sildi suurus on tavaliselt väike ja sõltub tee pikkusest.
  • Sõltumatus sektsioonist: Sihtfail või kaust võib asuda teisel kettasektsioonil või isegi failisüsteemis, mis erineb ise sildist.
  • Rikutud lingid: Kui sihtfail või kaust kustutatakse, muutub symboliline link "rikutuks" (broken) või "ripuks" (dangling), kuid ise link jääb alles.
  • Toetus: Seda toetab enamik kaasaegseid operatsioonisüsteeme (Linux, macOS, Windows NTFS-ga).

Võrdlus kõva lingiga (hard link):

Kriteerium Symbolic link Hard link
Failitüüp Eraldi failitüüp Täiendav link inode'i suhtes
Tee Säilitab tee sihtkoha juurde Ei säilita teed
Sektsioon/Fs Võib viidata teisele sektsioonile/Fs Peab olema samal sektsioonil/Fs
Kustutamine sihtkoha Link muutub katki Andmed on saadaval teiste linkide kaudu
Kaustadele Võib viidata kaustadele Tavaliselt ei saa viidata kaustadele

Java-s tehakse simboliliste linkidega tööd API java.nio.file kaudu.

// Näide simbolilise lingi loomise kohta
import java.io.IOException;
import java.nio.file.*;

public class SymlinkExample {

    public static void main(String[] args) {
        Path target = Paths.get("target_file.txt"); // Sihtfail
        Path link = Paths.get("mylink_to_target"); // Symboliline link

        try {
            // Loome sihtfaili (näiteks)
            Files.write(target, "Hello, World!".getBytes());

            // Loome symbolilise lingi
            Files.createSymbolicLink(link, target);
            System.out.println("Symboliline link loodud: " + link.toAbsolutePath());

            // Kontrollime, kas tee on symboliline link
            System.out.println(link.getFileName() + " on symboliline link: " + Files.isSymbolicLink(link));

            // Loeme sisu läbi lingi
            byte[] content = Files.readAllBytes(link);
            System.out.println("Sisu lingi kaudu: " + new String(content));

            // Lahendame lingi, et saada tee sihtfailile
             Path resolvedTarget = Files.readSymbolicLink(link);
             System.out.println("Lingitud sihtkoha tee: " + resolvedTarget);

        } catch (IOException e) {
            e.printStackTrace();
         } finally {
             // Kustutame loodud failid puhastamiseks
             try {
                 Files.deleteIfExists(link);
                 Files.deleteIfExists(target);
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
    }
}