L'autre jour, le code qui utilisait java.io.File avec chemin et fichiers Depuis que je l'ai remplacé, je vais l'introduire dans la perspective de réécrire le code existant. Si vous êtes déjà familier avec NIO2, vous ne remarquerez probablement rien après avoir lu cet article.
À propos, la nouvelle API liée aux fichiers de JDK7 s'appelle NIO2 (New I / O 2), et celle non marquée semble faire référence au Channel and Charset ajouté à l'ère 1.4.
La classe File a les deux fonctions suivantes.
--Définissez l'emplacement du fichier --Manipuler des fichiers
Il semble que NIO2 de JDK7 l'a divisé comme suit.
--Définissez l'emplacement du fichier ... java.nio.file.Path Interface --Manipuler les fichiers …… java.nio.file.Files
Je ne sais pas si la classe File sera complètement remplacée par Path & Files à l'avenir. En regardant le Javadoc de la classe File, il semble que toPath () était la seule méthode ajoutée dans la 1.7, et il n'y avait pas de nouvelle méthode dans la 1.8, donc le futur développement d'API lié aux fichiers se fera dans Files and Path. Je ne pense pas que ça va changer. Cependant, il existe encore de nombreuses bibliothèques dans le JDK qui ne traitent que les fichiers, pas le chemin. Par exemple, [FileChooser] de JavaFX (https://docs.oracle.com/javase/jp/8/javafx/api/javafx/stage/FileChooser.html) et l'API Drag & Drop ne peuvent gérer que File. Si vous souhaitez travailler avec la classe Files, vous devez la convertir en objet Path avec la méthode toPath () de la classe File.
Si vous avez du code en cours d'exécution dans java.io.File en ce moment et que votre code de test est parfait, vous ne devriez pas vous forcer à le réécrire dans Path, étant donné l'historique de la rétrocompatibilité Java. C'est également le cas s'il existe des circonstances qui vous obligent à développer dans un environnement antérieur à JDK6. Cependant, de nombreuses fonctions de la classe Files sont tout simplement excellentes, donc je pense que c'est une option pour essayer d'écrire dans NIO2, par exemple, pour les pièces nouvellement développées.
NIO2 a été ajouté depuis JDK7. Malheureusement, la plupart des classes du package java.nio ne sont pas implémentées dans le SDK Android, qui aurait un ensemble complet de bibliothèques JDK7.
https://developer.android.com/reference/java/nio/package-summary.html
Voir l'article ci-dessous pour plus de détails.
Il existe de nombreux autres excellents articles sur la bibliothèque qui existent depuis plus de 5 ans et qui sont hors du cadre de l'utilisation détaillée de Chemin et des fichiers et du remplacement à partir du fichier, je vais donc l'omettre dans cet article. Faire.
Je pense que le fichier est principalement créé en passant le chemin du fichier sous forme de chaîne (ou URL) au constructeur.
File file = new File("dir/file.txt");
Il existe une usine appelée Paths et c'est
get () '' Créez un objet en passant une chaîne ou un URI comme argument de méthode.
Path path = Paths.get("dir/file.txt");
Le fichier et le chemin peuvent être convertis l'un à l'autre. Si vous souhaitez utiliser NIO avec une bibliothèque qui ne renvoie pas de chemin, comme FileChooser ci-dessus, vous pouvez utiliser cette méthode pour le convertir en objet Path.
File -> Path
Path path = file.toPath();
Path -> File
File file = path.toFile();
Utilisez getAbsolutePath, qui renvoie une chaîne de chemins absolus.
file.getAbsolutePath();
Utilisez toAbsolutePath pour le convertir en un objet Path chemin absolu, puis toString () pour le convertir en chaîne.
path.toAbsolutePath().toString(),
file.exists();
Files.exists(path);
File.Utilisez canRead.
```java
file.canRead())
files#isreadable
Est utilisé.
Files.isReadable(Path)
File.Si vous utilisez mkdirs, il créera également un dossier parent. Le succès ou l'échec est renvoyé sous forme de valeur booléenne.
```java
new File("dir").mkdirs();
Utilisez Files # createDirectories. Cette méthode peut lever une IOException, vous devez donc gérer l'exception.
Files.createDirectories(dirPath);
Cela ne change pas grand-chose.
file.isDirectory()
Files.isDirectory(path)
File.Utilisez renameTo. Le succès ou l'échec est renvoyé sous forme de valeur booléenne.
```java
file.renameTo(dest);
files#move
Est utilisé. Le chemin du fichier modifié est renvoyé.
Files.move(path, destPath);
new File("file.txt").delete();
Files.delete(Paths.get("file.txt"));
Il existe également une méthode appelée `` deleteIfExists '' qui supprime le fichier lorsqu'il existe, ce qui renvoie une valeur booléenne.
Files.deleteIfExists(Paths.get("file.txt"));
En fait, c'est étrangement difficile.
Par exemple, si vous souhaitez travailler avec tous les fichiers dans le dossier
dir```, vous pouvez écrire le code pour obtenir les objets sous forme de tableau dans java.io.File comme suit.
File[] files = new File("dir").listFiles();
Avec JDK8, c'est facile avec `` Liste des # fichiers (chemin) ''.
Stream<Path> files = Files.list(Paths.get(articleDir));
Si vous voulez une liste au lieu d'un flux, collectez-la.
List<Path> files = Files.list(f).collect(Collectors.toList());
Pour JDK7, utiliseriez-vous
Files.newDirectoryStream``` ...?
try (final DirectoryStream<Path> directoryStream
= Files.newDirectoryStream(dir, Articles::isValidContentPath)){
// ……
} catch (final IOException e) {
e.printStackTrace();
}
lastmodified()
Vous pouvez obtenir la milliseconde avec la méthode.
final long lastModifiedMs = file.lastModified();
Files.avec getLastModifiedTime[FileTime](https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/attribute/FileTime.html)Vouspouvezobtenirl'objet,donctoMillis()Ensuite, vous pouvez obtenir la date et l'heure de la dernière mise à jour en millisecondes comme auparavant. La classe FileTime a une variété de méthodes de conversion différentes qui permettent de contourner plus facilement certains Java dans la phase de codage: "J'avais l'intention de l'obtenir en quelques secondes, mais c'était une milliseconde."
```java
Files.getLastModifiedTime(path).toMillis());
Cependant, contrairement à File # lastModified, getLastModifiedTime peut déclencher une IOException, vous devez donc gérer l'exception.
Je vais en présenter quelques-uns.
Files#newBufferedReader(Path path) Dans le passé, il était nécessaire d'encapsuler et d'initialiser le Reader comme indiqué ci-dessous, et je pense que j'ai créé une méthode qui initialise et renvoie le FileReader avec Oreole FileUtils, ou utilisé Apache Commons.
new BufferedReader(new InputStreamReader(new FileInputStream(pTargetFileName), pEncode));
Dans le cas de Files & Path, si le codage du fichier à lire est UTF-8, ce qui suit convient.
final BufferedReader fileReader = Files.newBufferedReader(path)
Vous pouvez gérer des fichiers avec des encodages différents en passant Charset comme deuxième argument.
Files#newBufferedWriter Bien sûr, il existe également des méthodes Writer.
final BufferedWriter writer = Files.newBufferedWriter(path);
Files#readAllLines Vous pouvez lire le contenu du fichier et obtenir ce que vous mettez dans la liste ligne par ligne. Je suis reconnaissant d'avoir créé ce genre de méthode moi-même et de l'avoir réutilisée. La gestion des exceptions IOException est requise.
final List<String> lines = Files.readAllLines(path);
Files#readAllBytes Cette méthode est utilisée lorsque vous souhaitez lire un petit fichier dans un tableau d'octets.
final byte[] bytes = Files.readAllBytes(path);
Files#write Écrit le contenu de l'octet [] dans le fichier avec le chemin spécifié. Pour afficher le contenu de la chaîne de caractères str dans le fichier de chemin, procédez comme suit. La gestion des exceptions IOException est requise.
Files.write(path, str.getBytes(StandardCharsets.UTF_8.name()));
Nous nous sommes concentrés sur la façon de remplacer le code de fichier existant par le code de chemin et de fichiers. Les fichiers ont de nombreuses méthodes qui nécessitent la gestion des exceptions et nécessitent un style de programmation qui gère les exceptions de manière appropriée. Le nombre de caractères à taper a également tendance à augmenter simplement par rapport à l'utilisation de File, il peut donc être difficile d'arriver au point au début. Malheureusement, les méthodes qui nécessitent une gestion des exceptions ne fonctionnent pas très bien avec les expressions Lambda.
De plus, bien que je n'ai pas écrit cette fois, la plupart des méthodes de la classe Files supposent que le codage du fichier à gérer est UTF-8, donc si vous utilisez un autre codage, il est difficile de le gérer. Peut être.
Web