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.
1.8.0_131
2.12.3
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.
--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
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
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`.
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