Créer un lien symbolique avec Java

1. Vue d'ensemble

Dans ce didacticiel, nous explorerons différentes manières de créer un lien symbolique en Java à l'aide de l'API NIO.2 et explorerons les différences entre les liens de fichiers matériels et logiciels.

2. Liens matériels vs souples / symboliques

Tout d'abord, définissons ce que sont les liens de fichiers et quel est leur comportement attendu. Un lien de fichier est un pointeur qui référence de manière transparente un fichier stocké dans le système de fichiers .

Un malentendu courant est de penser qu'un lien de fichier est un raccourci, alors vérifions leur comportement:

  • Un raccourci est un fichier normal qui fait référence à un fichier cible
  • Le lien souple / symbolique est un pointeur de fichier qui se comporte comme le fichier auquel le lien est lié - si le fichier cible est supprimé, le lien est inutilisable
  • Un lien physique est un pointeur de fichier qui reflète le fichier auquel il est lié, c'est donc fondamentalement comme un clone. Si le fichier cible est supprimé, le fichier de lien est toujours valide

La plupart des systèmes d'exploitation (Linux, Windows, Mac) prennent déjà en charge les liens de fichiers logiciels / durs, il ne devrait donc pas poser de problème de les utiliser à l'aide de l'API NIO.

3. Création de liens

Tout d'abord, nous devons créer un fichier cible vers lequel établir un lien, donc séquençons certaines données dans un fichier:

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; } 

Créons un lien symbolique vers un fichier existant, en nous assurant que le fichier créé est un lien symbolique:

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); } 

Ensuite, jetons un coup d'œil à la création d'un lien physique:

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); } 

En listant les fichiers avec leurs différences, nous pouvons voir que la taille du fichier du lien logiciel / symbolique est petite, tandis que le lien physique utilise le même espace que le fichier lié:

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

Pour comprendre clairement quelles sont les exceptions possibles qui peuvent être levées, voyons les exceptions vérifiées sur les opérations:

  • UnsupportedOperationException - lorsque la JVM ne prend pas en charge les liens de fichiers dans un système spécifique
  • FileAlreadyExistsException - lorsque le fichier de lien existe déjà, le remplacement n'est pas pris en charge par défaut
  • IOException - lorsqu'une erreur IO se produit, par exemple un chemin de fichier invalide
  • SecurityException - lorsque le fichier de lien ne peut pas être créé ou que le fichier cible n'est pas accessible en raison d'autorisations de fichier limitées

4. Opérations avec des liens

Maintenant, si nous avons un système de fichiers donné avec des liens de fichiers existants, il est possible de les identifier et d'afficher leurs fichiers cibles:

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)); } } } } 

Si nous l'exécutons dans notre chemin actuel:

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

Nous obtiendrions la sortie:

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

Notez que les fichiers de liens physiques ne sont pas simplement identifiables avec l'API de NIO , des opérations de bas niveau sont nécessaires pour travailler sur ce type de fichiers.

5. Conclusion

Cet article décrit les différents types de liens de fichiers, leur différence avec les raccourcis, et comment les créer et les utiliser à l'aide d'une API Java pure qui fonctionne sur les systèmes de fichiers traditionnels du marché.

L'implémentation de ces exemples et extraits de code se trouve à l'adresse over sur GitHub.