Schreiben Sie den Code für java.io.File mit java.nio.Path und java.nio.Files neu

Überblick

Neulich der Code, der java.io.File mit Pfad und Dateien verwendet hat Da ich es ersetzt habe, werde ich es aus der Perspektive des Umschreibens des vorhandenen Codes einführen. Wenn Sie bereits mit NIO2 vertraut sind, werden Sie nach dem Lesen dieses Artikels wahrscheinlich nichts bemerken.

Übrigens heißt die neue dateibezogene API von JDK7 NIO2 (New I / O 2), und die nicht markierte API scheint sich auf den Kanal und den Zeichensatz zu beziehen, die in der 1.4-Ära hinzugefügt wurden.

Hintergrund

Die File-Klasse hat die folgenden zwei Funktionen.

Es scheint, dass NIO2 von JDK7 es wie folgt aufgeteilt hat.

Ich weiß nicht, ob die File-Klasse in Zukunft vollständig durch Path & Files ersetzt wird. Wenn man sich das Javadoc der File-Klasse ansieht, scheint es, dass toPath () die einzige in 1.7 hinzugefügte Methode war und es in 1.8 keine neue Methode gab, sodass die zukünftige dateibezogene API-Entwicklung in Files and Path erfolgen wird. Ich glaube nicht, dass es sich ändern wird. Es gibt jedoch noch einige Bibliotheken im JDK, die sich nur mit Dateien befassen, nicht mit Path. Beispielsweise können JavaFXs FileChooser und die Drag & Drop-API nur Datei verarbeiten. Wenn Sie mit der Files-Klasse arbeiten möchten, müssen Sie sie mit der ToPath () -Methode der File-Klasse in ein Path-Objekt konvertieren.

Wenn in java.io.File gerade Code ausgeführt wird und Ihr Testcode perfekt ist, sollten Sie sich angesichts der Geschichte der Java-Abwärtskompatibilität nicht zwingen, ihn in Path umzuschreiben. Dies ist auch der Fall, wenn Sie unter Umständen gezwungen sind, sich in einer Umgebung vor JDK6 zu entwickeln. Viele der Funktionen der Files-Klasse sind jedoch einfach hervorragend, daher denke ich, dass es eine Option ist, beispielsweise für den neu zu entwickelnden Teil zu versuchen, in NIO2 zu schreiben.

Hinweis

NIO2 wurde seit JDK7 hinzugefügt. Leider sind die meisten Klassen im Paket java.nio nicht im Android SDK implementiert, das einen vollständigen Satz von JDK7-Bibliotheken enthalten soll.

https://developer.android.com/reference/java/nio/package-summary.html

Weitere Informationen finden Sie im folgenden Artikel.

Was nicht in diesem Artikel zu schreiben

Es gibt viele andere ausgezeichnete Artikel über die Bibliothek, die es seit mehr als 5 Jahren gibt, und sie liegt außerhalb des Bereichs der detaillierten Verwendung von Pfad und Dateien sowie des Ersetzens aus der Datei. Daher werde ich sie in diesem Artikel weglassen. Machen.


Objekterstellung

Für Datei

Ich denke, Datei wird hauptsächlich durch Übergeben des Dateipfads als Zeichenfolge (oder URL) an den Konstruktor erstellt.

File file = new File("dir/file.txt");

Für Pfad

Es gibt eine Factory namens Paths und sie lautet "get ()" Erstellen Sie ein Objekt, indem Sie eine Zeichenfolge oder einen URI als Methodenargument übergeben.

Path path = Paths.get("dir/file.txt");

Gegenseitige Konvertierung zwischen Datei und Pfad

Datei und Pfad können ineinander konvertiert werden. Wenn Sie NIO mit einer Bibliothek verwenden möchten, die keinen Pfad zurückgibt, wie z. B. FileChooser oben, können Sie diese Methode verwenden, um ihn in ein Pfadobjekt zu konvertieren.

File -> Path

Path path = file.toPath();

Path -> File

File file = path.toFile();

Holen Sie sich den absoluten Pfad der Datei

Für Datei

Verwenden Sie getAbsolutePath, das eine Zeichenfolge absoluter Pfade zurückgibt.

file.getAbsolutePath();

Für NIO2

Verwenden Sie toAbsolutePath, um in ein absolutes Pfadpfadobjekt zu konvertieren, und toString (), um es in eine Zeichenfolge zu konvertieren.

path.toAbsolutePath().toString(),

Überprüfen Sie die Existenz der Datei

Für Datei

file.exists();

Für NIO2

Files.exists(path);

Stellen Sie fest, ob die Datei lesbar ist

Für Datei

File.Verwenden Sie canRead.



```java
file.canRead())

Für NIO2

files#isreadableWird genutzt.

Files.isReadable(Path)

Erstellen Sie einen Ordner

Für Datei

File.Wenn Sie mkdirs verwenden, wird auch ein übergeordneter Ordner erstellt. Der Erfolg oder Misserfolg wird als Boolescher Wert zurückgegeben.



```java
new File("dir").mkdirs();

Für NIO2

Verwenden Sie Dateien # createDirectories. Diese Methode kann eine IOException auslösen, daher müssen Sie die Ausnahme behandeln.

Files.createDirectories(dirPath);

Stellen Sie fest, ob es sich um einen Ordner handelt

Es ändert sich nicht so viel.

Für Datei

file.isDirectory()

Für NIO2

Files.isDirectory(path)

Dateien verschieben

Für Datei

File.Verwenden Sie renameTo. Der Erfolg oder Misserfolg wird als Boolescher Wert zurückgegeben.



```java
file.renameTo(dest);

Für NIO2

files#moveWird genutzt. Der Pfad der geänderten Datei wird zurückgegeben.

Files.move(path, destPath);

Datei löschen

Für Datei

new File("file.txt").delete();

Für NIO2

Files.delete(Paths.get("file.txt"));

Es gibt auch eine Methode namens `` `deleteIfExists```, die die Datei löscht, wenn sie existiert, und einen booleschen Wert zurückgibt.

Files.deleteIfExists(Paths.get("file.txt"));

Bearbeiten Sie alle Dateien in einem Ordner

Eigentlich ist das seltsam schwierig.

Für java.io.File

Wenn Sie beispielsweise mit allen Dateien im Ordner `` `dir``` arbeiten möchten, können Sie den Code schreiben, um die Objekte wie folgt als Array in java.io.File abzurufen.

File[] files = new File("dir").listFiles();

Für NIO2

Mit JDK8 ist es einfach mit `Files # list (Path)`.

Stream<Path> files = Files.list(Paths.get(articleDir));

Wenn Sie eine Liste anstelle eines Streams möchten, sammeln Sie diese.

List<Path> files = Files.list(f).collect(Collectors.toList());

Würden Sie für JDK7 `` `Files.newDirectoryStream``` ... verwenden?

try (final DirectoryStream<Path> directoryStream
                = Files.newDirectoryStream(dir, Articles::isValidContentPath)){
    // ……
} catch (final IOException e) {
    e.printStackTrace();
}

Rufen Sie das Datum und die Uhrzeit der letzten Änderung der Datei in Millisekunden ab

Für Datei

lastmodified()Sie können die Millisekunde mit der Methode erhalten.

final long lastModifiedMs = file.lastModified();

Für NIO2

Files.mit getLastModifiedTime[FileTime](https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/attribute/FileTime.html)SiekönnendasObjekterhalten,alsozuMillis()Anschließend können Sie das Datum und die Uhrzeit der letzten Aktualisierung wie zuvor in Millisekunden abrufen. Die FileTime-Klasse verfügt über verschiedene Konvertierungsmethoden, die es einfacher machen, Java in der Codierungsphase zu umgehen: "Ich wollte es in Sekunden erhalten, aber es war Millisekunde."



```java
Files.getLastModifiedTime(path).toMillis());

Im Gegensatz zu File # lastModified kann getLastModifiedTime jedoch eine IOException auslösen, sodass Sie die Ausnahme behandeln müssen.


Eine kleine praktische Methode für Dateien

Ich werde einige davon vorstellen.

Files#newBufferedReader(Path path) In der Vergangenheit war es notwendig, den Reader wie unten gezeigt zu verpacken und zu initialisieren, und ich glaube, ich habe eine Methode erstellt, die den FileReader mit Oreole FileUtils initialisiert und zurückgibt, oder Apache Commons verwendet.

new BufferedReader(new InputStreamReader(new FileInputStream(pTargetFileName), pEncode));

Im Fall von Files & Path ist Folgendes in Ordnung, wenn die Codierung der zu lesenden Datei UTF-8 ist.

final BufferedReader fileReader = Files.newBufferedReader(path)

Sie können Dateien mit unterschiedlichen Codierungen verarbeiten, indem Sie Charset als zweites Argument übergeben.

Files#newBufferedWriter Natürlich gibt es auch Writer-Methoden.

final BufferedWriter writer = Files.newBufferedWriter(path);

Files#readAllLines Sie können den Inhalt der Datei lesen und zeilenweise abrufen, was Sie in die Liste aufgenommen haben. Ich bin dankbar, dass ich diese Methode selbst gemacht und wiederverwendet habe. Die Behandlung von IOException-Ausnahmen ist erforderlich.

final List<String> lines = Files.readAllLines(path);

Files#readAllBytes Diese Methode wird verwendet, wenn Sie eine kleine Datei in einem Byte-Array lesen möchten.

final byte[] bytes = Files.readAllBytes(path);

Files#write Schreibt den Inhalt von Byte [] mit dem angegebenen Pfad in die Datei. Um den Inhalt der Zeichenfolge str in die Pfaddatei auszugeben, gehen Sie wie folgt vor. Die Behandlung von IOException-Ausnahmen ist erforderlich.

Files.write(path, str.getBytes(StandardCharsets.UTF_8.name()));

Zusammenfassung

Wir haben uns darauf konzentriert, wie vorhandener Dateicode durch Pfad- und Dateicode ersetzt werden kann. Dateien verfügen über viele Methoden, die eine Ausnahmebehandlung erfordern, und erfordern einen Programmierstil, der Ausnahmen entsprechend behandelt. Die Anzahl der einzugebenden Zeichen nimmt im Vergleich zur Verwendung von Datei ebenfalls zu, sodass es zunächst schwierig sein kann, auf den Punkt zu kommen. Leider funktionieren Methoden, die eine Ausnahmebehandlung erfordern, mit Lambda-Ausdrücken nicht sehr gut.

Obwohl ich diesmal nicht geschrieben habe, gehen die meisten Methoden der Files-Klasse davon aus, dass die Codierung der zu behandelnden Datei UTF-8 ist. Wenn Sie also eine andere Codierung verwenden, ist es schwierig, damit umzugehen. Vielleicht.


Referenz

Bücher

Web

Recommended Posts

Schreiben Sie den Code für java.io.File mit java.nio.Path und java.nio.Files neu
Bereiten Sie die Umgebung für Java11 und JavaFx mit Ubuntu 18.4 vor
Code zum Lösen der Zufallszahlenmatrix nach der Pivot-Gauß-Eliminierungsmethode und der Gauß-Eliminierungsmethode und zum Vergleichen der Genauigkeit
Oracle Live für den Code
Beispielcode für das grundlegende Verspotten und Testen mit Mockito 3 + JUnit 5
Vorab geschriebener Quellcode für die Aktivität
Warten Sie, bis PostgreSQL mit Docker gestartet ist, und starten Sie dann den WEB-Dienst
Quellcode zum Finden einer normalen orthogonalen Basis mit der Orthogonalisierungsmethode von Gram-Schmidt
Verknüpfen Sie Java- und C ++ - Code mit SWIG
Code zum Lösen einer Zufallszahlenmatrix mit der Pivot-Gauß-Eliminierungsmethode
[Java] Schreiben Sie die von mir in der Vergangenheit aus java.io.File erstellten Funktionen mit NIO.2 neu.
Erleben Sie .NET 5 mit Docker und Visual Studio Code
Artikel und Bücher, die zum Studium von Testcode nützlich sind
Geben Sie das Zeitlimit für jeden Pfad mit Rack :: Timeout an