Al procesar archivos grandes, si utiliza FileInputStream, FileOutputStream o RandomAccessFile ordinarios ordinarios, el proceso se reducirá debido a la memoria externa de lectura y escritura frecuente. El siguiente es un experimento de comparación.
prueba de paquete; import java.io.bufferedInputStream; import java.io.fileInputStream; import java.io.filenotfoundException; import java.io.ioException; import java.io.randomaccessfile; import java.nio.MappedByteBuffer; import java.nio.channels.filechannel; Public Class Test {public static void main (string [] args) {try {fileInputStream Fis = new FileInputStream ("/Home/Tobacco/Test/Res.txt"); int sum = 0; int n; largo T1 = System.CurrentTimemillis (); intente {while ((n = fis.read ())> = 0) {sum+= n; }} Catch (ioException e) {// TODO Auto Generado Bloque E.PrintStackTrace (); } Long t = System.CurrentTimemillis ()-T1; System.out.println ("Sum:"+Sum+"Tiempo:"+t); } Catch (FileNotFoundException e) {// TODO Auto Generado Bloque E.PrintStackTrace (); } try {fileInputStream fis = new FileInputStream ("/Home/Tobacco/Test/Res.txt"); BufferedInputStream BIS = new BufferedInputStream (FIS); int sum = 0; int n; largo T1 = System.CurrentTimemillis (); intente {while ((n = bis.read ())> = 0) {sum+= n; }} Catch (ioException e) {// TODO Auto Generado Bloque E.PrintStackTrace (); } Long t = System.CurrentTimemillis ()-T1; System.out.println ("Sum:"+Sum+"Tiempo:"+t); } Catch (FileNotFoundException e) {// TODO Auto Generado Bloque E.PrintStackTrace (); } MappedByteBuffer buffer = null; Pruebe {buffer = new RandomAccessFile ("/Home/Tobacco/Test/Res.txt", "RW"). GetChannel (). MAP (fileChannel.mapmode.read_write, 0, 1253244); int sum = 0; int n; largo T1 = System.CurrentTimemillis (); para (int i = 0; i <1253244; i ++) {n = 0x000000ff & buffer.get (i); suma+= n; } Long t = System.CurrentTimemillis ()-T1; System.out.println ("Sum:"+Sum+"Tiempo:"+t); } Catch (FileNotFoundException e) {// TODO Auto Generado Bloque E.PrintStackTrace (); } Catch (ioException e) {// tODO Auto Generated BLOCK E.PrintStackTRace (); }}}El archivo de prueba es un archivo de tamaño 1253244 bytes. Resultados de la prueba:
Suma: 220152087 Hora: 1464
Suma: 220152087 Hora: 72
Suma: 220152087 Hora: 25
Significa que los datos se leen correctamente. Eliminar la parte de procesamiento de datos.
prueba de paquete; import java.io.bufferedInputStream; import java.io.fileInputStream; import java.io.filenotfoundException; import java.io.ioException; import java.io.randomaccessfile; import java.nio.MappedByteBuffer; import java.nio.channels.filechannel; Public Class Test {public static void main (string [] args) {try {fileInputStream Fis = new FileInputStream ("/Home/Tobacco/Test/Res.txt"); int sum = 0; int n; largo T1 = System.CurrentTimemillis (); intente {while ((n = fis.read ())> = 0) {// sum+= n; }} Catch (ioException e) {// TODO Auto Generado Bloque E.PrintStackTrace (); } Long t = System.CurrentTimemillis ()-T1; System.out.println ("Sum:"+Sum+"Tiempo:"+t); } Catch (FileNotFoundException e) {// TODO Auto Generado Bloque E.PrintStackTrace (); } try {fileInputStream fis = new FileInputStream ("/Home/Tobacco/Test/Res.txt"); BufferedInputStream BIS = new BufferedInputStream (FIS); int sum = 0; int n; largo T1 = System.CurrentTimemillis (); intente {while ((n = bis.read ())> = 0) {// sum+= n; }} Catch (ioException e) {// TODO Auto Generado Bloque E.PrintStackTrace (); } Long t = System.CurrentTimemillis ()-T1; System.out.println ("Sum:"+Sum+"Tiempo:"+t); } Catch (FileNotFoundException e) {// TODO Auto Generado Bloque E.PrintStackTrace (); } MappedByteBuffer buffer = null; Pruebe {buffer = new RandomAccessFile ("/Home/Tobacco/Test/Res.txt", "RW"). GetChannel (). MAP (fileChannel.mapmode.read_write, 0, 1253244); int sum = 0; int n; largo T1 = System.CurrentTimemillis (); for (int i = 0; i <1253244; i ++) {//n=0x000000ff&buffer.get(i); // sum+= n; } Long t = System.CurrentTimemillis ()-T1; System.out.println ("Sum:"+Sum+"Tiempo:"+t); } Catch (FileNotFoundException e) {// TODO Auto Generado Bloque E.PrintStackTrace (); } Catch (ioException e) {// tODO Auto Generated BLOCK E.PrintStackTRace (); }}}Resultados de la prueba:
Suma: 0 Tiempo: 1458
Suma: 0 Tiempo: 67
Suma: 0 Tiempo: 8
Se puede ver que después de asignar algunos o todos los archivos a la memoria para leer y escribir, la velocidad será mucho más alta.
Esto se debe a que el archivo mapeado de memoria primero asigna los archivos en la memoria externa a un área continua en la memoria, y se procesa como una matriz de bytes. Las operaciones de lectura y escritura operan directamente en la memoria, y luego reasignan el área de memoria al archivo de memoria externo, lo que ahorra el tiempo para la lectura y la escritura frecuentes de la memoria externa en el medio, reduciendo en gran medida el tiempo de lectura y escritura.
El código de implementación anterior para procesar archivos grandes utilizando la asignación de memoria en Java es todo el contenido que he compartido con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.