عند معالجة الملفات الكبيرة ، إذا كنت تستخدم FileInputStream العادي أو FileOutputStream أو RandomAccessFile لإجراء عمليات القراءة والكتابة المتكررة ، فسوف تبطئ العملية بسبب القراءة المتكررة وكتابة الذاكرة الخارجية. فيما يلي تجربة مقارنة.
اختبار الحزمة استيراد 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 () ؛ حاول {بينما ((n = fis.read ())> = 0) {sum+= n ؛ }} catch (ioException e) {// todo catch catch e.printstacktrace () ؛ } long t = system.currentTimeMillis ()-t1 ؛ system.out.println ("sum:"+sum+"الوقت:"+t) ؛ } catch (fileNotfoundException e) {// todo catch catch e.printstacktrace () ؛ } جرب {fileInputStream fis = new FileInputStream ("/home/tobacco/test/res.txt") ؛ BufferedInputStream BIS = جديد BufferedInputStream (FIS) ؛ int sum = 0 ؛ int n ؛ long t1 = system.currentTimeMillis () ؛ حاول {بينما ((n = bis.read ())> = 0) {sum+= n ؛ }} catch (ioException e) {// todo catch catch e.printstacktrace () ؛ } long t = system.currentTimeMillis ()-t1 ؛ system.out.println ("sum:"+sum+"الوقت:"+t) ؛ } catch (fileNotfoundException e) {// todo catch catch e.printstacktrace () ؛ } medbytebuffer buffer = null ؛ حاول {buffer = new RandomAccessFile ("/home/tobacco/test/res.txt" ، "rw"). getChannel (). 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) ؛ مجموع+= ن ؛ } long t = system.currentTimeMillis ()-t1 ؛ system.out.println ("sum:"+sum+"الوقت:"+t) ؛ } catch (fileNotfoundException e) {// todo catch catch e.printstacktrace () ؛ } catch (ioException e) {// todo acto catch block 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 () ؛ حاول {بينما ((n = fis.read ())> = 0) {// sum+= n ؛ }} catch (ioException e) {// todo catch catch e.printstacktrace () ؛ } long t = system.currentTimeMillis ()-t1 ؛ system.out.println ("sum:"+sum+"الوقت:"+t) ؛ } catch (fileNotfoundException e) {// todo catch catch e.printstacktrace () ؛ } جرب {fileInputStream fis = new FileInputStream ("/home/tobacco/test/res.txt") ؛ BufferedInputStream BIS = جديد BufferedInputStream (FIS) ؛ int sum = 0 ؛ int n ؛ long t1 = system.currentTimeMillis () ؛ حاول {بينما ((n = bis.read ())> = 0) {// sum+= n ؛ }} catch (ioException e) {// todo catch catch e.printstacktrace () ؛ } long t = system.currentTimeMillis ()-t1 ؛ system.out.println ("sum:"+sum+"الوقت:"+t) ؛ } catch (fileNotfoundException e) {// todo catch catch e.printstacktrace () ؛ } medbytebuffer buffer = null ؛ حاول {buffer = new RandomAccessFile ("/home/tobacco/test/res.txt" ، "rw"). getChannel (). 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+"الوقت:"+t) ؛ } catch (fileNotfoundException e) {// todo catch catch e.printstacktrace () ؛ } catch (ioException e) {// todo acto catch block e.printstacktrace () ؛ }}}نتائج الاختبار:
المبلغ: 0 الوقت: 1458
المبلغ: 0 الوقت: 67
المبلغ: 0 الوقت: 8
يمكن ملاحظة أنه بعد تعيين بعض أو كل الملفات إلى الذاكرة للقراءة والكتابة ، ستكون السرعة أعلى بكثير.
وذلك لأن الملف الذي تم تعيين الذاكرة يقوم أولاً بتخطيط الملفات على الذاكرة الخارجية إلى منطقة مستمرة في الذاكرة ، ويتم معالجتها كصفيف بايت. تعمل عمليات القراءة والكتابة مباشرة على الذاكرة ، ثم تعيد إعادة تصميم منطقة الذاكرة إلى ملف الذاكرة الخارجي ، مما يوفر وقت القراءة والكتابة المتكررة للذاكرة الخارجية في الوسط ، مما يقلل من وقت القراءة والكتابة بشكل كبير.
رمز التنفيذ أعلاه لمعالجة الملفات الكبيرة باستخدام تعيين الذاكرة في Java هو كل المحتوى الذي شاركته معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.