Lorsque vous traitez des fichiers volumineux, si vous utilisez FileInputStream, FileOutputStream ou RandomAccessFile pour effectuer des opérations de lecture et d'écriture fréquentes, le processus ralentira en raison de la lecture et de l'écriture fréquentes de la mémoire externe. Ce qui suit est une expérience de comparaison.
test de package; Importer java.io.BufferedInputStream; import java.io.fileInputStream; import java.io.filenotfoundException; Importer java.io.ioException; import java.io.randomaccessfile; Importer java.nio.mappytebuffer; Importer java.nio.channels.fileChannel; classe publique test {public static void main (String [] args) {try {fileInputStream fis = new FileInputStream ("/ home / tabac / test / res.txt"); int sum = 0; int n; long t1 = System.currenttimemillis (); try {while ((n = fis.read ())> = 0) {sum + = n; }} catch (ioException e) {// TODO GÉNÉRATEUR AUTO GÉNÉRÉ BLOC E.PRINTSTACKTRACE (); } long t = System.currenttimemillis () - t1; System.out.println ("SUM:" + SUM + "Time:" + T); } catch (filenotfoundException e) {// TODO Block de capture généré automatiquement e.printStackTrace (); } essayez {fileInputStream fis = new FileInputStream ("/ home / tobacco / test / res.txt"); BufferedInputStream bis = new BufferedInputStream (FIS); int sum = 0; int n; long t1 = System.currenttimemillis (); try {while ((n = bis.read ())> = 0) {sum + = n; }} catch (ioException e) {// TODO GÉNÉRATEUR AUTO GÉNÉRÉ BLOC E.PRINTSTACKTRACE (); } long t = System.currenttimemillis () - t1; System.out.println ("SUM:" + SUM + "Time:" + T); } catch (filenotfoundException e) {// TODO Block de capture généré automatiquement e.printStackTrace (); } MaptedByteBuffer Buffer = NULL; try {buffer = new randomaccessfile ("/ home / tabac / test / res.txt", "rw"). getChannel (). map (filechannel.mapMode.read_write, 0, 1253244); int sum = 0; int n; long t1 = System.currenttimemillis (); pour (int i = 0; i <1253244; i ++) {n = 0x000000ff & buffer.get (i); sum + = n; } long t = System.currenttimemillis () - t1; System.out.println ("SUM:" + SUM + "Time:" + T); } catch (filenotfoundException e) {// TODO Block de capture généré automatiquement e.printStackTrace (); } catch (ioException e) {// TODO Bloc de capture généré automatiquement e.printStackTrace (); }}}Le fichier de test est un fichier de taille 1253244 octets. Résultats des tests:
Sum: 220152087 Temps: 1464
Sum: 220152087 Temps: 72
Sum: 220152087 Temps: 25
Cela signifie que les données sont lues correctement. Supprimez la pièce de traitement des données.
test de package; Importer java.io.BufferedInputStream; import java.io.fileInputStream; import java.io.filenotfoundException; Importer java.io.ioException; import java.io.randomaccessfile; Importer java.nio.mappytebuffer; Importer java.nio.channels.fileChannel; classe publique test {public static void main (String [] args) {try {fileInputStream fis = new FileInputStream ("/ home / tabac / test / res.txt"); int sum = 0; int n; long t1 = System.currenttimemillis (); try {while ((n = fis.read ())> = 0) {// sum + = n; }} catch (ioException e) {// TODO GÉNÉRATEUR AUTO GÉNÉRÉ BLOC E.PRINTSTACKTRACE (); } long t = System.currenttimemillis () - t1; System.out.println ("SUM:" + SUM + "Time:" + T); } catch (filenotfoundException e) {// TODO Block de capture généré automatiquement e.printStackTrace (); } essayez {fileInputStream fis = new FileInputStream ("/ home / tobacco / test / res.txt"); BufferedInputStream bis = new BufferedInputStream (FIS); int sum = 0; int n; long t1 = System.currenttimemillis (); try {while ((n = bis.read ())> = 0) {// sum + = n; }} catch (ioException e) {// TODO GÉNÉRATEUR AUTO GÉNÉRÉ BLOC E.PRINTSTACKTRACE (); } long t = System.currenttimemillis () - t1; System.out.println ("SUM:" + SUM + "Time:" + T); } catch (filenotfoundException e) {// TODO Block de capture généré automatiquement e.printStackTrace (); } MaptedByteBuffer Buffer = NULL; try {buffer = new randomaccessfile ("/ home / tabac / test / res.txt", "rw"). getChannel (). map (filechannel.mapMode.read_write, 0, 1253244); int sum = 0; int n; long t1 = System.currenttimemillis (); pour (int i = 0; i <1253244; i ++) {//n=0x000000ff&buffer.get(i); // sum + = n; } long t = System.currenttimemillis () - t1; System.out.println ("SUM:" + SUM + "Time:" + T); } catch (filenotfoundException e) {// TODO Block de capture généré automatiquement e.printStackTrace (); } catch (ioException e) {// TODO Bloc de capture généré automatiquement e.printStackTrace (); }}}Résultats des tests:
Somme: 0 heure: 1458
Sum: 0 Heure: 67
Sum: 0 Heure: 8
On peut voir qu'après cartographier certains ou tous les fichiers en mémoire pour la lecture et l'écriture, la vitesse sera beaucoup plus élevée.
En effet, le fichier mappé de mémoire mappe d'abord les fichiers sur la mémoire externe dans une zone continue en mémoire, et est traité sous forme de tableau d'octets. Les opérations de lecture et d'écriture fonctionnent directement sur la mémoire, puis recoupent la zone de mémoire dans le fichier de mémoire externe, ce qui permet d'économiser le temps pour la lecture et l'écriture fréquentes de la mémoire externe au milieu, réduisant considérablement le temps de lecture et d'écriture.
Le code d'implémentation ci-dessus pour le traitement des fichiers volumineux à l'aide du mappage de mémoire en Java est tout le contenu que j'ai partagé avec vous. J'espère que vous pourrez vous faire référence et j'espère que vous pourrez soutenir Wulin.com plus.