Bei der Verarbeitung großer Dateien, wenn Sie ordentliche FileInputStream, FileOutputStream oder RandomAccessfile verwenden, um häufige Lese- und Schreibvorgänge durchzuführen, verlangsamt sich der Prozess aufgrund des häufigen Lesens und Schreibens externer Speicher. Das Folgende ist ein Vergleichsexperiment.
Pakettest; import Java.io.BufferedInputStream; import Java.io.FileInputStream; importieren java.io.filenotfoundException; importieren 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/tabacco/test/res.txt"); int sum = 0; int n; long t1 = system.currentTimemillis (); try {while ((n = fis.read ())> = 0) {sum+= n; }} catch (ioException e) {// Todo automatisch generierter Fangblock E. printstacktrace (); } long t = system.currentTimemillis ()-t1; System.out.println ("sum:"+sum+"Zeit:"+t); } catch (FilenotFoundException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } try {FileInputStream fis = new FileInputStream ("/home/tabacco/test/res.txt"); BufferedInputStream Bis = neuer BufferedInputStream (FIS); int sum = 0; int n; long t1 = system.currentTimemillis (); try {while ((n = Bis.read ())> = 0) {sum+= n; }} catch (ioException e) {// Todo automatisch generierter Fangblock E. printstacktrace (); } long t = system.currentTimemillis ()-t1; System.out.println ("sum:"+sum+"Zeit:"+t); } catch (FilenotFoundException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } MapappedBytebuffer buffer = null; try {buffer = new randomAccessFile ("/home/tabacco/test/res.txt", "rw"). getCanNel (). map (filechannel.mapMode.read_write, 0, 1253244); int sum = 0; int n; long t1 = system.currentTimemillis (); für (int i = 0; i <1253244; i ++) {n = 0x000000ff & buffer.get (i); sum+= n; } long t = system.currentTimemillis ()-t1; System.out.println ("sum:"+sum+"Zeit:"+t); } catch (FilenotFoundException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } catch (ioException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); }}}Die Testdatei ist eine Datei der Größe 1253244 Bytes. Testergebnisse:
Summe: 220152087 Zeit: 1464
Summe: 220152087 Zeit: 72
Summe: 220152087 Zeit: 25
Dies bedeutet, dass die Daten korrekt gelesen werden. Löschen Sie den Datenverarbeitungsteil.
Pakettest; import Java.io.BufferedInputStream; import Java.io.FileInputStream; importieren java.io.filenotfoundException; importieren 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/tabacco/test/res.txt"); int sum = 0; int n; long t1 = system.currentTimemillis (); try {while ((n = fis.read ())> = 0) {// sum+= n; }} catch (ioException e) {// Todo automatisch generierter Fangblock E. printstacktrace (); } long t = system.currentTimemillis ()-t1; System.out.println ("sum:"+sum+"Zeit:"+t); } catch (FilenotFoundException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } try {FileInputStream fis = new FileInputStream ("/home/tabacco/test/res.txt"); BufferedInputStream Bis = neuer BufferedInputStream (FIS); int sum = 0; int n; long t1 = system.currentTimemillis (); try {while ((n = Bis.read ())> = 0) {// sum+= n; }} catch (ioException e) {// Todo automatisch generierter Fangblock E. printstacktrace (); } long t = system.currentTimemillis ()-t1; System.out.println ("sum:"+sum+"Zeit:"+t); } catch (FilenotFoundException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } MapappedBytebuffer buffer = null; try {buffer = new randomAccessFile ("/home/tabacco/test/res.txt", "rw"). getCanNel (). map (filechannel.mapMode.read_write, 0, 1253244); int sum = 0; int n; long t1 = system.currentTimemillis (); für (int i = 0; i <1253244; i ++) {//n=0x0000ffff&buffer.get(i); // sum+= n; } long t = system.currentTimemillis ()-t1; System.out.println ("sum:"+sum+"Zeit:"+t); } catch (FilenotFoundException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } catch (ioException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); }}}Testergebnisse:
Summe: 0 Zeit: 1458
Summe: 0 Zeit: 67
Summe: 0 Zeit: 8
Es ist ersichtlich, dass nach dem Zuordnen einiger oder aller Dateien zum Speichern und Schreiben die Geschwindigkeit viel höher ist.
Dies liegt daran, dass die von Speicher zugeordnete Datei zuerst die Dateien auf dem externen Speicher in einen kontinuierlichen Bereich im Speicher bildet und als Byte -Array verarbeitet wird. Die Lese- und Schreibvorgänge arbeiten direkt mit dem Speicher und überarbeiten dann den Speicherbereich in die externe Speicherdatei, die die Zeit für das häufige Lesen und Schreiben des externen Speichers in der Mitte speichert und die Lese- und Schreibzeit erheblich verkürzt.
Der obige Implementierungscode für die Verarbeitung großer Dateien mithilfe von Speicherzuordnung in Java ist der gesamte Inhalt, den ich mit Ihnen geteilt habe. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.