Erstellen Sie eine symbolische Verknüpfung mit Java

1. Übersicht

In diesem Lernprogramm werden verschiedene Möglichkeiten zum Erstellen einer symbolischen Verknüpfung in Java mithilfe der NIO.2-API untersucht und die Unterschiede zwischen Hard- und Softfile-Verknüpfungen untersucht.

2. Harte vs weiche / symbolische Links

Definieren wir zunächst, was Dateilinks sind und wie sie sich voraussichtlich verhalten. Ein Dateilink ist ein Zeiger, der transparent auf eine im Dateisystem gespeicherte Datei verweist .

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

  • Eine Verknüpfung ist eine reguläre Datei, die auf eine Zieldatei verweist
  • Soft / Symbolic Link ist ein Dateizeiger, der sich wie die Datei verhält, auf die verlinkt wird. Wenn die Zieldatei gelöscht wird, ist der Link unbrauchbar
  • 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 Linkdatei weiterhin gültig

Die meisten Betriebssysteme (Linux, Windows, Mac) unterstützen bereits Soft / Hard-Dateilinks, daher sollte es kein Problem sein, diese mithilfe der NIO-API zu bearbeiten.

3. Links erstellen

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, um sicherzustellen, 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); } 

Durch Auflisten der Dateien mit ihren Unterschieden können wir feststellen, dass die Größe der Soft- / Symbolic-Link-Datei gering ist, während der Hard-Link denselben Speicherplatz wie die verknüpfte Datei verwendet:

 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 Operationen 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. B. ein ungültiger Dateipfad
  • SecurityException - Wenn die Linkdatei nicht erstellt werden kann oder auf die Zieldatei aufgrund eingeschränkter Dateiberechtigungen nicht zugegriffen werden kann

4. Operationen mit Links

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 auf unserem aktuellen Pfad ausführen:

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

Wir würden die Ausgabe bekommen:

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

Beachten Sie, dass Hardlink-Dateien nicht einfach mit der NIO-API identifizierbar sind. Für die Bearbeitung dieser Art von Dateien sind Operationen auf niedriger Ebene erforderlich.

5. Schlussfolgerung

In diesem Artikel werden die verschiedenen Arten von Dateilinks, ihre Unterschiede zu Verknüpfungen sowie das Erstellen und Bearbeiten dieser 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 auf GitHub.