Erstelle einen symbolischen Link mit Java

1. Überblick

In diesem Lernprogramm werden verschiedene Möglichkeiten zum Erstellen einer symbolischen Verknüpfung in Java mithilfe vonNIO.2 APIuntersucht und die Unterschiede zwischen Hard- und Soft-Dateiverknüpfungen untersucht.

Definieren wir zunächst, was Dateilinks sind und wie sie sich voraussichtlich verhalten. A file link is a pointer that transparently references a file stored in the file system.

Ein häufiges Missverständnis ist der Gedanke, dass ein Dateilink eine Verknüpfung ist. Überprüfen wir daher ihr Verhalten:

  • Eine Verknüpfung ist eine reguläre Datei, die auf eine Zieldatei verweist

  • Soft/Symbolic link is a file pointer that behaves as the file that is linking to – if the target file gets deleted then the link is unusable

  • Ein fester Link ist ein Dateizeiger, der die Datei widerspiegelt, mit der er verknüpft ist. Er ähnelt also im Grunde einem Klon. Wenn die Zieldatei gelöscht wird, ist die Verknüpfungsdatei weiterhin gültig

Die meisten Betriebssysteme (Linux, Windows, Mac) unterstützen bereits Soft / Hard-Dateilinks, daher sollte es kein Problem sein, diese mitNIO APIzu bearbeiten.

Zuerst müssen wir eine Zieldatei erstellen, mit der eine Verknüpfung hergestellt werden soll. Lassen Sie uns also einige Daten in eine Datei sequenzieren:

public Path createTextFile() throws 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;
}

Erstellen wir eine symbolische Verknüpfung zu einer vorhandenen Datei und stellen Sie sicher, dass die erstellte Datei eine symbolische Verknüpfung ist:

public void createSymbolicLink() throws IOException {
    Path target = createTextFile();
    Path link = Paths.get(".","symbolic_link.txt");
    if (Files.exists(link)) {
        Files.delete(link);
    }
    Files.createSymbolicLink(link, target);
}

Schauen wir uns als nächstes eine Hardlink-Erstellung an:

public void createHardLink() throws IOException {
    Path target = createTextFile();
    Path link = Paths.get(".", "hard_link.txt");
    if (Files.exists(link)) {
        Files.delete(link);
    }
    Files.createLink(link, target);
}

Wenn Sie die Dateien mit ihren Unterschieden auflisten, können Sie feststellen, dass die Größe der Datei für weiche / symbolische Verknüpfungen gering ist, während die harte Verknüpfung denselben Speicherplatz wie die verknüpfte Datei belegt:

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

Um klar zu verstehen, welche möglichen Ausnahmen ausgelöst werden können, sehen wir uns die aktivierten Ausnahmen für die Vorgänge an:

  • UnsupportedOperationException - wenn die JVM keine Dateilinks in einem bestimmten System unterstützt

  • FileAlreadyExistsException - Wenn die Linkdatei bereits vorhanden ist, wird die Überschreibung standardmäßig nicht unterstützt

  • IOException - wenn ein E / A-Fehler auftritt, z. Ungültiger Dateipfad

  • SecurityException - Wenn die Verknüpfungsdatei aufgrund eingeschränkter Dateiberechtigungen nicht erstellt werden kann oder auf die Zieldatei nicht zugegriffen werden kann

Wenn wir nun ein bestimmtes Dateisystem mit vorhandenen Dateilinks haben, können diese identifiziert und ihre Zieldateien angezeigt werden:

public void printLinkFiles(Path path) throws IOException {
    try (DirectoryStream stream = Files.newDirectoryStream(path)) {
        for (Path file : stream) {
            if (Files.isDirectory(file)) {
                printLinkFiles(file);
            } else if (Files.isSymbolicLink(file)) {
                System.out.format("File link '%s' with target '%s' %n",
                  file, Files.readSymbolicLink(file));
            }
        }
    }
}

Wenn wir es in unserem aktuellen Pfad ausführen:

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

Wir würden die Ausgabe bekommen:

File link 'symbolic_link.txt' with target 'target_link.txt'

Note that hard link files aren’t simply identifiable with NIO’s API,low-level operations sind erforderlich, um diese Art von Dateien zu bearbeiten.

5. Fazit

In diesem Artikel werden die verschiedenen Arten von Dateilinks, ihre Unterschiede zu Verknüpfungen sowie das Erstellen und Ausführen von Verknüpfungen mithilfe einer reinen Java-API beschrieben, die über die gängigen Dateisysteme auf dem Markt funktioniert.

Die Implementierung dieser Beispiele und Codefragmente finden Sie inover on GitHub.