Présentation du package Java NIO
-
Présentation du package Java
NIO
-
Utiliser le package
NIO
pour lire et écrire dans un fichier en Java
Ce tutoriel présente le package Java NIO
. Nous avons déjà un package java.io
pour effectuer des opérations de lecture/écriture, mais java.nio
nous permet de travailler différemment avec des fonctionnalités supplémentaires.
Comment? Plongeons dans ses détails.
Présentation du package Java NIO
Java New Input/Output (NIO
) est une structure de gestion de fichiers et une API de mise en réseau hautes performances. Le package java.nio
contient toutes les classes NIO
; il ne remplace pas les classes d’entrée/sortie basées sur les flux (IO
) dans le package java.io
.
Le Java NIO
a été introduit à partir de la version JDK 4
fonctionne comme une alternative à java.io
avec quelques caractéristiques et fonctionnalités supplémentaires pour travailler avec les entrées/sorties (IO
) différemment par rapport à l’entrée/sortie standard (IO
).
Nous savons déjà que le package java.io
possède toutes les classes nécessaires que nous pouvons utiliser pour les opérations d’E/S Java, tandis que le java.nio
introduit des classes buffer
qui peuvent être utilisées dans les API Java NIO
.
Vous vous posez peut-être une question : quand on a déjà un package java.io
, pourquoi en introduire un nouveau nommé java.nio
?
Principales raisons d’utiliser le package Java NIO
Nous préférons utiliser le package java.nio
pour deux raisons.
-
Le package
java.nio
utilise une approche orientée tampon qui nous permet d’aller et venir dans le tampon. Il utilise un bloc de mémoire (également appelé tampon) pour lire et mettre en cache les données, auxquelles on accède rapidement à partir du tampon chaque fois que nécessaire ; nous pouvons également écrire des données dans le tampon. -
Le package
java.nio
peut effectuer des opérations d’entrée/sortie (IO
) non bloquantes. Ici, non bloquant signifie qu’il peut lire les données/informations selon ce qu’il trouve prêt.Par exemple, nous avons un thread qui demande au canal de lire les données/informations du tampon ; le thread va pour d’autres opérations dans ce laps de temps et continue là où il a laissé le travail. Pendant ce temps, le processus de lecture est terminé et améliore les performances globales.
La principale différence entre NIO
et IO
est que NIO
est non bloquant tandis que IO
est bloquant.
Nous pouvons donner la priorité à l’utilisation de Java NIO
par rapport au package IO
chaque fois que nous recherchons une approche orientée tampon et des opérations d’entrée / sortie à grande vitesse.
NIO
, vous devez comprendre le package Java IO
.Principaux composants du package Java NIO
Il a les composants principaux suivants pour fonctionner correctement.
Buffer
- Comme le packagejava.nio
est orienté tampon, il possède des tampons pour les types de données primitifs. Les tampons sont utilisés comme conteneurs où nous pouvons lire des données depuis/vers le tampon pour un traitement ultérieur en utilisant un canal.Channel
- La classe de canal dejava.nio
est similaire aux flux (fluxIO
) utilisés pour la communication bidirectionnelle. En utilisant des canaux, nous pouvons effectuer des opérations d’entrée/sortie non bloquantes ; nous pouvons également lire/écrire des données depuis/vers la mémoire tampon des canaux.
Les canaux sont utilisés comme une passerelle où la connexion à diverses entités est décrite par des canaux qui peuvent effectuer des opérations IO
non bloquantes.
-
Seletor
- Nous pouvons utiliser des sélecteurs pour accomplir des opérationsIO
non bloquantes. Un sélecteur (un objet) surveille plus d’un canal pour les événements.On peut dire que les sélecteurs sélectionnent les canaux prêts à effectuer des opérations d’entrée/sortie.
Utiliser le package NIO
pour lire et écrire dans un fichier en Java
Voici la représentation graphique des différentes classes qui peuvent être utilisées pour effectuer différentes opérations.
Vous pouvez en savoir plus sur java.nio
ici, mais nous nous concentrons sur la lecture à partir d’un fichier et l’écriture sur des opérations liées à un fichier dans ce didacticiel ; voir les exemples suivants.
Exemple de code (pour lire à partir d’un fichier) :
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public class readFromFile {
public static void main(String[] args) {
Path filePath = Paths.get("file.txt");
Charset charSet = Charset.forName("ISO-8859-1");
try {
List<String> lines = Files.readAllLines(filePath, charSet);
for (String line : lines) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println(e);
}
}
}
Exemple de code (pour écrire dans un fichier) :
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
public class writeToFile {
public static void main(String[] args) {
Path filePath = Paths.get("file.txt");
String message = "We have overwritten the file";
Charset charSet = Charset.forName("ISO-8859-1");
try {
Files.write(filePath, message.getBytes());
List<String> lines = Files.readAllLines(filePath, charSet);
for (String line : lines) {
System.out.println(line);
}
} catch (IOException e) {
System.out.println(e);
}
}
}
Sortie (lecture à partir d’un fichier et écriture dans un fichier) :
Nous lisons les données du fichier spécifié et les imprimons sur la ligne de commande dans le premier extrait de code. Dans le deuxième exemple de code, nous écrivons les données (une petite chaîne) dans le fichier donné et les imprimons à l’écran pour indiquer ce qui est écrit dans le fichier.
Dans le premier exemple de code, nous appelons la méthode Paths.get()
la méthode de fabrique pour l’instance Path
. En termes simples, nous pouvons dire qu’il crée une instance Path
chaque fois que nous appelons la méthode statique nommée get()
de la classe java.nio.file.Paths
.
Cette méthode prend soit une séquence de chaînes (ces chaînes seront jointes pour former un chemin), soit une chaîne en tant que paramètres et la convertit en l’instance Path
. Il lance InvalidPathException
si des caractères illégaux se trouvent dans la chaîne que nous passons.
Comme File
, java.nio.file.Path
peut faire référence à un chemin relatif ou absolu dans le système de fichiers.
Charset
est utilisé pour l’encodage des caractères. Nous utilisons le codage de caractères ISO-8859-1
, mais vous pouvez spécifier UTF-8
ou tout autre que vous souhaitez utiliser.
La méthode readAllLines()
lit un fichier texte ligne par ligne. Nous sauvegardons les données lues dans une List
de String
(voir le code).
De plus, nous utilisons une boucle for
pour afficher toutes les lignes lues à l’écran.
Dans le deuxième exemple de code, toute la logique est la même sauf cette ligne de code.
Files.write(filePath, message.getBytes());
Le File.write()
est une méthode statique du package Java NIO
utilisée pour écrire dans le fichier spécifié.