[JAVA] Gérez les fichiers avec NIO.2.

Lorsque je traite des fichiers récemment, j'utilise de meilleurs fichiers. better-files lui-même est un wrapper Scala autour de Java NIO, mais au fait, je ne savais pas grand-chose sur l'API autour des opérations de fichiers ajoutées dans Java NIO.2, donc je vais l'utiliser.

NIO.2 Qu'est-ce que NIO.2 en premier lieu? au fait. Une API introduite dans Java SE 7 qui améliore NIO introduite dans Java 1.4. Plus précisément, ce qui suit.

Il intègre des fonctions qui n'ont pas pu être intégrées à NIO. Après cela, nous examinerons les fichiers, c'est-à-dire l'interface du système de fichiers, comme mentionné au début.

L'environnement d'exécution ressemble à ceci. Écrivez en Scala.

On suppose que vous avez importé les éléments suivants.

scala> import java.nio.file._
scala> import java.io.File
scala> import java.nio.file.attribute._

java.nio.file.Path Une interface qui indique l'emplacement des fichiers et des répertoires. Je pense que "Path" est la clé de cette interface de système de fichiers. C'était étrange que File représente également un répertoire, donc c'est bien de pouvoir penser à des chemins.

Génération d'instance

--Utilisez java.nio.file.Paths

scala> val path1 = Paths.get("dir/file.txt")
path1: java.nio.file.Path = dir/file.txt

--Utilisez java.nio.file.FileSystems

scala> val path2 = FileSystems.getDefault.getPath("dir", "file.txt")
path2: java.nio.file.Path = dir/file.txt

--Conversion depuis java.io.File

scala> val file = new File("dir/file.txt")
file: java.io.File = dir/file.txt

scala> val path3 = file.toPath
path3: java.nio.file.Path = dir/file.txt

Chemin absolu / chemin relatif

Les exemples jusqu'à présent ont été écrits avec des chemins relatifs. Si vous souhaitez générer avec un chemin absolu, cela ressemble à ce qui suit.

scala> val absolutePath1 = Paths.get("/tmp/dir/file.txt")
absolutePath1: java.nio.file.Path = /tmp/dir/file.txt

scala> val absolutePath2 = Paths.get("/", "tmp", "dir", "file.txt")
absolutePath2: java.nio.file.Path = /tmp/dir/file.txt

Conversion en java.io.File

scala> val path = Paths.get("dir/file.txt")
path: java.nio.file.Path = dir/file.txt

scala> val file = path.toFile
file: java.io.File = dir/file.txt

java.nio.file.FileSystem Interface avec le système de fichiers. Il semble que les systèmes de fichiers normaux, les fichiers ZIP et les fichiers Jar peuvent être traités de manière transparente avec cette interface.

java.nio.file.FileSystems C'est une fabrique qui crée FileSystem. Dans l'exemple de génération de Path, le système de fichiers par défaut de la plate-forme est acquis par la méthode getDefalut.

scala> val file = path1.toFile
file: java.io.File = dir/file.txt

java.nio.file.Paths Je l'ai utilisé plus tôt, mais il n'y a qu'une méthode pour générer Path, donc c'est une fabrique de Path. Il appelle simplement FileSystems.getDefault.getPath à l'intérieur, il est donc préférable d'utiliser celui-ci.

java.nio.file.Files Une interface qui gère les fichiers et les répertoires. Fondamentalement, c'est comme passer Path et faire quelque chose pour le fichier réel de ce chemin ou décomposer. Similaire à FileUtils dans les E / S communes.

Je suis sûr que vous allez essayer d'utiliser copier / déplacer / supprimer, que vous utilisez fréquemment.

copy

scala> val src = Paths.get("dir/src.txt")
src: java.nio.file.Path = dir/src.txt

scala> val dest = Paths.get("dir/dest.txt")
dest: java.nio.file.Path = dir/dest.txt

scala> val path = Files.copy(src, dest)
path: java.nio.file.Path = dir/dest.txt

La valeur de retour est le dest passé en argument. Si le fichier src n'existe pas, une exception "NoSuchFileException" se produira. Si le fichier dest existe, FileAlreadyExistsException se produira.

La méthode copy peut recevoir une interface appelée CopyOption avec le troisième argument. Vous pouvez maintenant décider comment vous souhaitez copier. Par exemple, StandardCopyOption.REPLACE_EXISTING peut être spécifié pour remplacer le fichier s'il existe. Voir ci-dessous pour plus de détails.

move

scala> val src = Paths.get("dir/src.txt")
src: java.nio.file.Path = dir/src.txt

scala> val path = Files.move(src, dest)
path: java.nio.file.Path = dir/dest.txt

C'est presque la même chose que "copier".

Si le fichier dest existe, une exception FileAlreadyExistsException se produira.

delete

scala> val path = Paths.get("dir/file.txt")
path: java.nio.file.Path = dir/file.txt

scala> Files.delete(path)

Dans le cas de delete, il n'y a pas de valeur de retour. Si vous supprimez Path, ce sera une chose inexistante, donc il ne retournera rien.

Si le fichier à supprimer n'existe pas, une exception "NoSuchFileException" se produira.

Je l'ai essayé avec des fichiers ici, mais bien sûr, il peut également gérer les répertoires.

L'API pour fonctionner en passant "Chemin" vers "Fichiers" est bonne. Il existe d'autres méthodes qui vous permettent d'obtenir des lecteurs, des écrivains, des canaux et des flux à partir de Fichiers, ce qui facilite le travail avec Fichiers`.

Attributs de fichier

Dans le cas de File, seuls les attributs communs à l'OS peuvent être gérés, mais dans NIO.2, les attributs de chaque OS peuvent également être traités. Les attributs sont le propriétaire du fichier, la date de création, la date de modification, les autorisations, etc.

Je vais vraiment l'obtenir.

scala> val path = Paths.get("dir/file.txt")
path: java.nio.file.Path = dir/file.txt

scala> val attributes = Files.getFileAttributeView(path, classOf[PosixFileAttributeView]).readAttributes()
attributes: java.nio.file.attribute.PosixFileAttributes = sun.nio.fs.UnixFileAttributes@364beb26


scala> attributes.creationTime
res0: java.nio.file.attribute.FileTime = 2017-08-28T22:45:16Z

scala> attributes.owner
res1: java.nio.file.attribute.UserPrincipal = asmasa

Bien sûr, vous pouvez également le définir.

scala> Files.setLastModifiedTime(path, FileTime.fromMillis(System.currentTimeMillis()))
res2: java.nio.file.Path = dir/file.txt

scala> val owner = FileSystems.getDefault.getUserPrincipalLookupService .lookupPrincipalByName("test")
owner: java.nio.file.attribute.UserPrincipal = test

scala> Files.setOwner(path, owner)
res3: java.nio.file.Path = dir/file.txt

Vous pouvez le faire comme ça.

scala> Files.setAttribute(path, "lastModifiedTime", FileTime.fromMillis(System.currentTimeMillis()))
res4: java.nio.file.Path = dir/file.txt

J'ai jeté un coup d'œil à l'interface de fichier NIO.2, mais c'est plus facile à utiliser que lorsqu'il s'agissait de File. Il est agréable de comprendre que vous opérez via Files.

Recommended Posts

Gérez les fichiers avec NIO.2.
[Java] Gérer les fichiers Excel avec Apache POI
Manipuler le dispositif avec des rails
Gérez JSON avec minimal-json
Gérer les dates avec Javascript (moment.js)
Gérez facilement les fichiers de guerre sous Windows
Téléchargez des fichiers volumineux avec Apache JMeter
[Ruby] Gérez les variables d'instance avec des méthodes d'instance
Gérer DatePicker avec Ruby / gtk3 + glade3
Gérez JSON sans effort avec le respone Json d'Alamofire
Faites glisser et déposez des fichiers avec JavaFX
Gérer les fichiers CSV téléchargés sur GCS
[Java] Lecture et écriture de fichiers avec OpenCSV
[Kotlin] Supprimer les fichiers en double [Java]
Comment gérer les erreurs de connexion avec l'appareil