При обработке больших файлов, если вы используете обычные файлы, файловые, файловые или случайные операции для выполнения частых операций чтения и записи, процесс будет замедляться из -за частого чтения и записи внешней памяти. Ниже приведен сравнительный эксперимент.
Пакет -тест; Импорт java.io.bufferedinputstream; импортировать java.io.fileinputstream; Импорт java.io.filenotFoundException; импортировать java.io.ioexception; Импорт java.io.randomaccessfile; импортировать java.nio.mappedbytebuffer; Импорт java.nio.channels.fileChannel; открытый тест класса {public static void main (string [] args) {try {fileInputStream fis = new FileInputStream ("/home/tobacco/test/res.txt"); int sum = 0; int n; long t1 = System.currentTimeMillis (); try {while ((n = fis.read ())> = 0) {sum+= n; }} catch (ioException e) {// todo автоматически сгенерированный блок e.printstacktrace (); } long t = System.currentTimeMillis ()-T1; System.out.println ("sum:"+sum+"time:"+t); } catch (filenotfoundexception e) {// todo автоматически сгенерированный блок e.printstacktrace (); } try {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 автоматически сгенерированный блок e.printstacktrace (); } long t = System.currentTimeMillis ()-T1; System.out.println ("sum:"+sum+"time:"+t); } catch (filenotfoundexception e) {// todo автоматически сгенерированный блок e.printstacktrace (); } Mapedbytebuffer buffer = null; try {buffer = new randomaccessfile ("/home/tobacco/test/res.txt", "rw"). getCannel (). Map (fileChannel.mapmode.read_write, 0, 1253244); int sum = 0; int n; long t1 = System.currentTimeMillis (); для (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 автоматически сгенерированный блок e.printstacktrace (); } catch (ioException e) {// todo автоматически сгенерированный блок e.printstacktrace (); }}}Испытательный файл представляет собой файл размера 1253244 байтов. Результаты теста:
Сумма: 220152087 Время: 1464
Сумма: 220152087 Время: 72
Сумма: 220152087 Время: 25
Это означает, что данные читаются правильно. Удалить часть обработки данных.
Пакет -тест; Импорт java.io.bufferedinputstream; импортировать java.io.fileinputstream; Импорт java.io.filenotFoundException; импортировать java.io.ioexception; Импорт java.io.randomaccessfile; импортировать java.nio.mappedbytebuffer; Импорт java.nio.channels.fileChannel; открытый тест класса {public static void main (string [] args) {try {fileInputStream fis = new FileInputStream ("/home/tobacco/test/res.txt"); int sum = 0; int n; long t1 = System.currentTimeMillis (); try {while ((n = fis.read ())> = 0) {// sum+= n; }} catch (ioException e) {// todo автоматически сгенерированный блок e.printstacktrace (); } long t = System.currentTimeMillis ()-T1; System.out.println ("sum:"+sum+"time:"+t); } catch (filenotfoundexception e) {// todo автоматически сгенерированный блок e.printstacktrace (); } try {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 автоматически сгенерированный блок e.printstacktrace (); } long t = System.currentTimeMillis ()-T1; System.out.println ("sum:"+sum+"time:"+t); } catch (filenotfoundexception e) {// todo автоматически сгенерированный блок e.printstacktrace (); } Mapedbytebuffer buffer = null; try {buffer = new randomaccessfile ("/home/tobacco/test/res.txt", "rw"). getCannel (). Map (fileChannel.mapmode.read_write, 0, 1253244); int sum = 0; int n; long t1 = System.currentTimeMillis (); для (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 автоматически сгенерированный блок e.printstacktrace (); } catch (ioException e) {// todo автоматически сгенерированный блок e.printstacktrace (); }}}Результаты теста:
Сумма: 0 Время: 1458
Сумма: 0 Время: 67
Сумма: 0 Время: 8
Можно видеть, что после сопоставления некоторых или всех файлов в память для чтения и письма скорость будет намного выше.
Это связано с тем, что файл с отображением памяти сначала отображает файлы на внешней памяти в непрерывную область в памяти и обрабатывается в виде байтового массива. Операции чтения и записи непосредственно работают в памяти, а затем перемещает область памяти во внешнюю память, что сохраняет время для частого чтения и написания внешней памяти в середине, значительно сокращая время чтения и записи.
Приведенный выше код реализации для обработки больших файлов с использованием отображения памяти в Java - это весь контент, которым я поделился с вами. Я надеюсь, что вы можете дать вам ссылку, и я надеюсь, что вы сможете поддержать Wulin.com больше.