程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java頂用內存映照處置年夜文件的完成代碼

Java頂用內存映照處置年夜文件的完成代碼

編輯:關於JAVA

Java頂用內存映照處置年夜文件的完成代碼。本站提示廣大學習愛好者:(Java頂用內存映照處置年夜文件的完成代碼)文章只能為提供參考,不一定能成為您想要的結果。以下是Java頂用內存映照處置年夜文件的完成代碼正文


在處置年夜文件時,假如應用通俗的FileInputStream 或許FileOutputStream 抑或RandomAccessFile 來停止頻仍的讀寫操作,都將招致過程因頻仍讀寫外存而下降速度.以下為一個比較試驗。

package test; 
 
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; 
      long t1=System.currentTimeMillis(); 
      try { 
        while((n=fis.read())>=0){ 
          sum+=n; 
        } 
      } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
      } 
      long t=System.currentTimeMillis()-t1; 
      System.out.println("sum:"+sum+" time:"+t); 
    } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      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 Auto-generated catch block 
        e.printStackTrace(); 
      } 
      long t=System.currentTimeMillis()-t1; 
      System.out.println("sum:"+sum+" time:"+t); 
    } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 
     
    MappedByteBuffer buffer=null; 
    try { 
      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(); 
      for(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 Auto-generated catch block 
      e.printStackTrace(); 
    } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 
 
  } 
 
} 

測試文件為一個年夜小為1253244字節的文件。測試成果:

sum:220152087  time:1464

sum:220152087  time:72

sum:220152087  time:25

解釋讀數據無誤。刪去個中的數據處置部門。

package test; 
 
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; 
      long t1=System.currentTimeMillis(); 
      try { 
        while((n=fis.read())>=0){ 
          //sum+=n; 
        } 
      } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
      } 
      long t=System.currentTimeMillis()-t1; 
      System.out.println("sum:"+sum+" time:"+t); 
    } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      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 Auto-generated catch block 
        e.printStackTrace(); 
      } 
      long t=System.currentTimeMillis()-t1; 
      System.out.println("sum:"+sum+" time:"+t); 
    } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 
     
    MappedByteBuffer buffer=null; 
    try { 
      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(); 
      for(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 Auto-generated catch block 
      e.printStackTrace(); 
    } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 
 
  } 
 
} 

測試成果:

sum:0  time:1458

sum:0  time:67

sum:0  time:8

因而可知,將文件部門或許全體映照到內存落後行讀寫,速度將進步許多。

這是由於內存映照文件起首將外存上的文件映照到內存中的一塊持續區域,被當做一個字節數組停止處置,讀寫操作直接對內存停止操作,爾後再將內存區域從新映照到外存文件,這就節儉了中央頻仍的對外存停止讀寫的時光,年夜年夜下降了讀寫時光。

以上這篇Java頂用內存映照處置年夜文件的完成代碼就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved