Réécrivez le code de java.io.File avec java.nio.Path et java.nio.Files

Aperçu

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.

Contexte

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.

Mise en garde

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.

Ce qu'il ne faut pas écrire dans cet article

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.


Création d'objets

Pour fichier

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");

Pour le chemin

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");

Conversion mutuelle entre fichier et chemin

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();

Obtenez le chemin absolu du fichier

Pour fichier

Utilisez getAbsolutePath, qui renvoie une chaîne de chemins absolus.

file.getAbsolutePath();

Pour NIO2

Utilisez toAbsolutePath pour le convertir en un objet Path chemin absolu, puis toString () pour le convertir en chaîne.

path.toAbsolutePath().toString(),

Vérifier l'existence du fichier

Pour fichier

file.exists();

Pour NIO2

Files.exists(path);

Déterminez si le fichier est lisible

Pour fichier

File.Utilisez canRead.



```java
file.canRead())

Pour NIO2

files#isreadableEst utilisé.

Files.isReadable(Path)

Créer un dossier

Pour fichier

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();

Pour NIO2

Utilisez Files # createDirectories. Cette méthode peut lever une IOException, vous devez donc gérer l'exception.

Files.createDirectories(dirPath);

Déterminez s'il s'agit d'un dossier

Cela ne change pas grand-chose.

Pour fichier

file.isDirectory()

Pour NIO2

Files.isDirectory(path)

Déplacer des fichiers

Pour fichier

File.Utilisez renameTo. Le succès ou l'échec est renvoyé sous forme de valeur booléenne.



```java
file.renameTo(dest);

Pour NIO2

files#moveEst utilisé. Le chemin du fichier modifié est renvoyé.

Files.move(path, destPath);

Supprimer le fichier

Pour fichier

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

Pour NIO2

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"));

Manipuler tous les fichiers dans un dossier

En fait, c'est étrangement difficile.

Pour java.io.File

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();

Pour NIO2

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();
}

Obtenez la date et l'heure de la dernière modification du fichier en millisecondes

Pour fichier

lastmodified()Vous pouvez obtenir la milliseconde avec la méthode.

final long lastModifiedMs = file.lastModified();

Pour NIO2

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.


Une méthode peu pratique pour les fichiers

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()));

Résumé

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.


référence

Livres

Web

Recommended Posts

Réécrivez le code de java.io.File avec java.nio.Path et java.nio.Files
Préparer l'environnement pour java11 et javaFx avec Ubuntu 18.4
Code pour résoudre la matrice de nombres aléatoires par la méthode d'élimination Pivot Gauss et la méthode d'élimination Gauss et comparer la précision
Oracle Live pour le code
Exemple de code pour la simulation de base et les tests avec Mockito 3 + JUnit 5
Code source pré-écrit pour l'activité
Attendez que PostgreSQL démarre avec Docker, puis démarrez le service WEB
Code source pour trouver une base orthogonale normale avec la méthode d'orthogonalisation de Gram-Schmidt
Lier le code Java et C ++ avec SWIG
Code pour résoudre une matrice de nombres aléatoires avec la méthode d'élimination Pivot Gauss
[Java] Réécrire les fonctions créées par moi-même dans le passé à partir de java.io.File avec NIO.2.
Découvrez .NET 5 avec Docker et Visual Studio Code
Articles et livres utiles pour étudier le code de test
Spécifiez le délai d'expiration pour chaque chemin avec Rack :: Timeout