[JAVA] Behandeln Sie Dateien mit NIO.2.

Wenn ich mich kürzlich mit Dateien beschäftige, verwende ich bessere Dateien. Better-Files selbst ist ein Scala-Wrapper für Java NIO, aber ich wusste übrigens nicht viel über die API für in Java NIO.2 hinzugefügte Dateivorgänge, daher werde ich sie verwenden.

NIO.2 Was ist NIO.2 überhaupt? Apropos. Eine in Java SE 7 eingeführte API, die das in Java 1.4 eingeführte NIO erweitert. Insbesondere das Folgende.

--Dateisystemschnittstelle

Es enthält Funktionen, die nicht in NIO integriert werden konnten. Danach werden wir uns die Dateien ansehen, dh die Dateisystemschnittstelle, wie am Anfang erwähnt.

Die Ausführungsumgebung sieht so aus. Schreiben Sie in Scala.

Es wird davon ausgegangen, dass Sie Folgendes importiert haben.

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

java.nio.file.Path Eine Schnittstelle, die den Speicherort von Dateien und Verzeichnissen angibt. Ich denke, "Pfad" ist der Schlüssel zu dieser Dateisystemschnittstelle. Es war seltsam, dass "Datei" auch ein Verzeichnis darstellt, daher ist es schön, an Pfade denken zu können.

Instanzgenerierung

--Verwenden Sie java.nio.file.Paths

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

--Verwenden Sie java.nio.file.FileSystems

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

--Umwandlung von 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

Absoluter Pfad / relativer Pfad

Die bisherigen Beispiele wurden mit relativen Pfaden geschrieben. Wenn Sie mit einem absoluten Pfad generieren möchten, sieht es wie folgt aus.

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

Konvertierung in 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 Schnittstelle zum Dateisystem. Es scheint, dass normale Dateisysteme, ZIP-Dateien und Jar-Dateien mit dieser Schnittstelle transparent behandelt werden können.

java.nio.file.FileSystems Es ist eine Fabrik, die "FileSystem" erstellt. In dem Beispiel, das "Pfad" generiert, wird die Methode "getDefalut" verwendet, um das Standarddateisystem der Plattform abzurufen.

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

java.nio.file.Paths Ich habe es früher verwendet, aber es gibt nur eine Methode, um "Pfad" zu generieren, also ist es eine Fabrik von "Pfad". Es ruft nur "FileSystems.getDefault.getPath" auf, also ist es besser, dieses zu verwenden.

java.nio.file.Files Eine Schnittstelle, die Dateien und Verzeichnisse verarbeitet. Im Grunde ist es so, als würde man "Pfad" übergeben und etwas für die eigentliche Datei dieses Pfads oder der Dekremation tun. Ähnlich wie "FileUtils" in Commons IO.

Ich bin sicher, Sie werden versuchen, Kopieren / Verschieben / Löschen zu verwenden, das Sie häufig verwenden.

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

Der Rückgabewert ist das als Argument übergebene Ziel. Wenn die src-Datei nicht vorhanden ist, tritt eine "NoSuchFileException" auf. Wenn die Zieldatei vorhanden ist, tritt "FileAlreadyExistsException" auf.

Die copy -Methode kann eine Schnittstelle namens CopyOption mit dem dritten Argument empfangen. Jetzt können Sie entscheiden, wie Sie kopieren möchten. Wenn die Datei beispielsweise in "StandardCopyOption.REPLACE_EXISTING" vorhanden ist, können Sie angeben, dass sie ersetzt werden soll. Siehe unten für Details.

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

Es ist fast das gleiche wie "Kopie".

Wenn die Zieldatei vorhanden ist, tritt eine "FileAlreadyExistsException" auf.

delete

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

scala> Files.delete(path)

Im Fall von "Löschen" gibt es keinen Rückgabewert. Wenn Sie "Pfad" löschen, ist dies nicht vorhanden, sodass nichts zurückgegeben wird.

Wenn die zu löschende Datei nicht vorhanden ist, tritt eine "NoSuchFileException" auf.

Ich habe es hier mit Dateien versucht, aber natürlich kann es auch mit Verzeichnissen umgehen.

Die API, die durch Übergeben von "Pfad" an "Dateien" ausgeführt werden soll, ist gut. Es gibt andere Methoden, mit denen Sie Leser, Schreiber, Kanäle und Streams aus "Dateien" abrufen können, wodurch die Arbeit mit "Dateien" einfacher wird.

Dateiattribute

Im Fall von "Datei" konnten nur die Attribute behandelt werden, die dem Betriebssystem gemeinsam sind, aber in NIO.2 können auch die Attribute für jedes Betriebssystem behandelt werden. Attribute sind Dateieigentümer, Erstellungsdatum, Änderungsdatum, Berechtigungen usw.

Ich werde es tatsächlich bekommen.

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

Natürlich können Sie es auch einstellen.

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

Sie können es so machen.

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

Ich habe mir die NIO.2-Dateischnittstelle angesehen, aber sie ist einfacher zu verwenden als "Datei". Es ist schön zu verstehen, dass Sie über "Dateien" arbeiten.

Recommended Posts

Behandeln Sie Dateien mit NIO.2.
[Java] Behandeln Sie Excel-Dateien mit Apache POI
Gerät mit Schienen handhaben
Behandeln Sie JSON mit minimal-json
Behandle Daten mit Javascript (moment.js)
Einfacher Umgang mit Kriegsdateien unter Windows
Laden Sie große Dateien mit Apache JMeter herunter
[Ruby] Behandeln Sie Instanzvariablen mit Instanzmethoden
Behandle DatePicker mit Ruby / gtk3 + glade3
Behandeln Sie JSON mühelos mit Alamofires Antwort Json
Ziehen Sie Dateien mit JavaFX per Drag & Drop
Behandeln Sie in GCS hochgeladene CSV-Dateien
[Java] Lesen und Schreiben von Dateien mit OpenCSV
[Kotlin] Doppelte Dateien löschen [Java]
So behandeln Sie Anmeldefehler mit devise