激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java中用內存映射處理大文件的實現代碼

Java中用內存映射處理大文件的實現代碼

2020-05-12 12:23jingxian JAVA教程

下面小編就為大家帶來一篇Java中用內存映射處理大文件的實現代碼。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在處理大文件時,如果利用普通的FileInputStream 或者FileOutputStream 抑或RandomAccessFile 來進行頻繁的讀寫操作,都將導致進程因頻繁讀寫外存而降低速度.如下為一個對比實驗。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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

說明讀數據無誤。刪去其中的數據處理部分。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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中用內存映射處理大文件的實現代碼就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 综合成人在线 | 免费的性生活视频 | 性色av免费在线观看 | 爱性久久久久久久 | 多男操一女视频 | 成人毛片免费 | 成人精品视频网站 | 蜜桃视频观看麻豆 | 黄色免费av | 在线免费观看欧美 | 成人三级视频在线观看 | 搜一级毛片 | 亚洲资源在线 | 成人在线视频免费播放 | 日本68xxxx| 久久精品亚洲成在人线av网址 | 国产羞羞视频 | 日本在线国产 | av在线1 | 欧美一级网 | 宅男噜噜噜66国产在线观看 | 日日狠狠久久偷偷四色综合免费 | 激情网站在线观看 | 国产啊v在线观看 | 免费一区在线 | 国产91久久精品一区二区 | av在线在线| 日韩av片在线免费观看 | hd日本xxxx| 欧美精品一区二区三区在线 | 精品国产乱码久久久久久久久 | 成人午夜在线免费视频 | 露脸各种姿势啪啪的清纯美女 | 91九色视频在线播放 | 国产在线精品一区二区三区 | 亚洲精品一区二区三区免 | 日本一级淫片1000部 | 国产在线精品一区二区三区 | 国产精品久久久久久久久久尿 | 今井夏帆av一区二区 | 成人做爽爽爽爽免费国产软件 |