Lors du traitement de fichiers volumineux, si vous utilisez FileInputStream ou FileOutputStream ou RandomAccessFile ordinaires pour effectuer des opérations de lecture et d'écriture fréquentes, cela ralentira le processus en raison de la lecture et de l'écriture fréquentes de la mémoire externe.
Copiez le code comme suit :
test de paquet ;
importer java.io.BufferedInputStream ;
importer java.io.FileInputStream ;
importer java.io.FileNotFoundException ;
importer java.io.IOException ;
importer java.io.RandomAccessFile ;
importer java.nio.MappedByteBuffer ;
importer java.nio.channels.FileChannel ;
Test de classe publique {
public static void main (String[] arguments) {
essayer {
FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");
somme int=0 ;
entier n;
long t1=System.currentTimeMillis();
essayer {
while((n=fis.read())>=0){
somme+=n;
}
} catch (IOException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
long t=System.currentTimeMillis()-t1;
System.out.println("somme:"+sum+" time:"+t);
} catch (FileNotFoundException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
essayer {
FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");
BufferedInputStream bis=nouveau BufferedInputStream(fis);
somme int=0 ;
entier n;
long t1=System.currentTimeMillis();
essayer {
while((n=bis.read())>=0){
somme+=n;
}
} catch (IOException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
long t=System.currentTimeMillis()-t1;
System.out.println("somme:"+somme+" time:"+t);
} catch (FileNotFoundException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
Tampon MappedByteBuffer=null ;
essayer {
buffer=new RandomAccessFile("/home/tobacco/test/res.txt","rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1253244);
somme int=0 ;
entier n;
long t1=System.currentTimeMillis();
pour(int i=0;i<1253244;i++){
n=0x000000ff&buffer.get(i);
somme+=n;
}
long t=System.currentTimeMillis()-t1;
System.out.println("somme:"+sum+" time:"+t);
} catch (FileNotFoundException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
} catch (IOException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
}
}
Le fichier de test est un fichier d'une taille de 1253244 octets. Résultats des tests :
Copiez le code comme suit :
somme : 220152087 heure : 1464
somme : 220152087 heure : 72
somme : 220152087 heure : 25
Cela indique que les données lues sont correctes. Supprimez la partie traitement des données.
Copiez le code comme suit :
test de paquet ;
importer java.io.BufferedInputStream ;
importer java.io.FileInputStream ;
importer java.io.FileNotFoundException ;
importer java.io.IOException ;
importer java.io.RandomAccessFile ;
importer java.nio.MappedByteBuffer ;
importer java.nio.channels.FileChannel ;
Test de classe publique {
public static void main (String[] arguments) {
essayer {
FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");
somme int=0 ;
entier n;
long t1=System.currentTimeMillis();
essayer {
while((n=fis.read())>=0){
//somme+=n;
}
} catch (IOException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
long t=System.currentTimeMillis()-t1;
System.out.println("somme:"+sum+" time:"+t);
} catch (FileNotFoundException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
essayer {
FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");
BufferedInputStream bis=nouveau BufferedInputStream(fis);
somme int=0 ;
entier n;
long t1=System.currentTimeMillis();
essayer {
while((n=bis.read())>=0){
//somme+=n;
}
} catch (IOException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
long t=System.currentTimeMillis()-t1;
System.out.println("somme:"+sum+" time:"+t);
} catch (FileNotFoundException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
Tampon MappedByteBuffer=null ;
essayer {
buffer=new RandomAccessFile("/home/tobacco/test/res.txt","rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1253244);
somme int=0 ;
entier n;
long t1=System.currentTimeMillis();
pour(int i=0;i<1253244;i++){
//n=0x000000ff&buffer.get(i);
//somme+=n;
}
long t=System.currentTimeMillis()-t1;
System.out.println("somme:"+sum+" time:"+t);
} catch (FileNotFoundException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
} catch (IOException e) {
// TODO Bloc catch généré automatiquement
e.printStackTrace();
}
}
}
Résultats des tests :
Copiez le code comme suit :
somme : 0 heure : 1458
somme : 0 heure : 67
somme :0 temps :8
On peut voir que la vitesse sera grandement améliorée en mappant une partie ou la totalité du fichier dans la mémoire pour la lecture et l'écriture.
En effet, le fichier mappé en mémoire mappe d'abord le fichier sur la mémoire externe à une zone continue de la mémoire, qui est traitée comme un tableau d'octets. Les opérations de lecture et d'écriture opèrent directement sur la mémoire, puis remapper la zone mémoire sur la mémoire. Mémoire externe. Fichier, ce qui permet d'économiser le temps de lecture et d'écriture fréquentes du stockage externe et de réduire considérablement le temps de lecture et d'écriture.