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.
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.
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.
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.
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");
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");
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();
Verwenden Sie getAbsolutePath, das eine Zeichenfolge absoluter Pfade zurückgibt.
file.getAbsolutePath();
Verwenden Sie toAbsolutePath, um in ein absolutes Pfadpfadobjekt zu konvertieren, und toString (), um es in eine Zeichenfolge zu konvertieren.
path.toAbsolutePath().toString(),
file.exists();
Files.exists(path);
File.Verwenden Sie canRead.
```java
file.canRead())
files#isreadable
Wird genutzt.
Files.isReadable(Path)
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();
Verwenden Sie Dateien # createDirectories. Diese Methode kann eine IOException auslösen, daher müssen Sie die Ausnahme behandeln.
Files.createDirectories(dirPath);
Es ändert sich nicht so viel.
file.isDirectory()
Files.isDirectory(path)
File.Verwenden Sie renameTo. Der Erfolg oder Misserfolg wird als Boolescher Wert zurückgegeben.
```java
file.renameTo(dest);
files#move
Wird genutzt. Der Pfad der geänderten Datei wird zurückgegeben.
Files.move(path, destPath);
new File("file.txt").delete();
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"));
Eigentlich ist das seltsam schwierig.
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();
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();
}
lastmodified()
Sie können die Millisekunde mit der Methode erhalten.
final long lastModifiedMs = file.lastModified();
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.
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()));
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.
Web
Recommended Posts