Vous l'avez sûrement deviné, mais "
nio" signifie :
New I/O.
Comme je vous l'ai dit précédemment, ce package a été créé afin d'améliorer les performances sur le traitement des fichiers, du réseau et des buffers.
Nous parlerons de la programmation réseau dans un chapitre dédié à ce type de programmation.
Ce package offre une nouvelle façon de lire les données. Nous nous intéresserons uniquement à l'aspect fichier, pour le moment.
Vous avez pu constater que les objets du package
java.io
traitaient les données par octets. Les objets du package
java.nio
, eux, les traitent par blocs de données : ce qui signifie que la lecture en est accélérée !
Tout repose sur deux objets dans ce nouveau package : les
channels et les
buffers .
Les channels sont en fait des flux, tout comme dans l'ancien package, mais ceux-ci sont amenés à travailler avec un buffer dont vous définissez la taille !
Pour simplifier au maximum
Lorsque vous ouvrez un flux vers un fichier avec un objet
FileInputStream, vous pouvez récupérer un canal vers ce fichier. Celui-ci, combiné avec un buffer, vous permettra de lire votre fichier encore plus vite qu'avec un
BufferedInputStream !
Reprenez le gros fichier que je vous ai fait faire dans le chapitre précédent. Voici
l'adresse à laquelle le retrouver pour ceux qui auraient déjà effacé le dit fichier.
Nous allons maintenant le relire avec ce nouveau package en comparant le buffer conventionnel et la nouvelle façon de faire :
Code : Java 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 | //Package à importer afin d'utiliser l'objet File
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.FileChannel;
public class Main {
public static void main(String[] args) {
FileInputStream fis;
BufferedInputStream bis;
FileChannel fc;
try {
//Création des objets
fis = new FileInputStream(new File("test.txt"));
bis = new BufferedInputStream(fis);
//Démarrage du chrono
long time = System.currentTimeMillis();
//Lecture
while(bis.read() != -1);
//Temps d'exécution
System.out.println("Temps d'exécution avec un buffer conventionnel : " + (System.currentTimeMillis() - time));
//Re-création d'un flux de fichier
fis = new FileInputStream(new File("test.txt"));
//On récupère le canal
fc = fis.getChannel();
//On en déduit la taille
int size = (int)fc.size();
//On crée un buffer
//correspondant à la taille du fichier
ByteBuffer bBuff = ByteBuffer.allocate(size);
//Démarrage du chrono
time = System.currentTimeMillis();
//Démarrage de la lecture
fc.read(bBuff);
//On prépare à la lecture avec l'appel à flip
bBuff.flip();
//Affichage du temps d'exécution
System.out.println("Temps d'exécution avec un nouveau buffer : " + (System.currentTimeMillis() - time));
//Vu que nous avons pris un buffer de byte
//Afin de récupérer les données, nous pouvons utiliser
//un tableau de byte
//La méthode array retourne un tableau de byte
byte[] tabByte = bBuff.array();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
|
Et le résultat :
Vous constatez que les gains de performance ne sont pas négligeables...
Il est vrai aussi que ce nouveau package est le plus souvent utilisé pour les flux circulant sur les réseaux...
Je ne m'attarderai donc pas sur le sujet, mais une petite présentation était de mise.
Vous devez savoir tout de même que ce package offre un buffer par type primitif pour la lecture sur le channel, vous trouverez donc les classes :
- IntBuffer ;
- CharBuffer ;
- ShortBuffer ;
- ByteBuffer ;
- DoubleBuffer ;
- FloatBuffer ;
- LongBuffer.
Ce chapitre avait pour vocation de vous présenter le reste des classes disponibles dans la hiérarchie du package
java.io
et de vous présenter le package
java.nio
.
Vu qu'il n'y a rien de compliqué et de franchement nouveau (à part
nio), je vous fais grâce du topo et du QCM... Mais ce sera l'une des rares fois !
