亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java中使用內存映射實現大文件上傳實例

2019-11-26 15:19:23
字體:
來源:轉載
供稿:網友

在處理大文件時,如果利用普通的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

由此可見,將文件部分或者全部映射到內存后進行讀寫,速度將提高很多。

這是因為內存映射文件首先將外存上的文件映射到內存中的一塊連續區域,被當成一個字節數組進行處理,讀寫操作直接對內存進行操作,而后再將內存區域重新映射到外存文件,這就節省了中間頻繁的對外存進行讀寫的時間,大大降低了讀寫時間。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩换脸av一区在线观看| 色琪琪综合男人的天堂aⅴ视频| 色综合久久88| 国产精品都在这里| 国产日韩欧美在线观看| 色哟哟入口国产精品| 国产精品99久久久久久久久久久久| 亚洲免费av网址| 国产91网红主播在线观看| 米奇精品一区二区三区在线观看| 亚洲精品国产精品自产a区红杏吧| 欧美日韩在线影院| 97视频免费看| 国产专区精品视频| 91久久久久久| 日韩av电影手机在线| 日韩av电影免费观看高清| 欧美亚洲第一页| 精品人伦一区二区三区蜜桃网站| 久久精品国产2020观看福利| 亚洲视频在线免费观看| 国产噜噜噜噜久久久久久久久| 97色在线播放视频| 一区二区在线视频| 欧洲亚洲在线视频| 日韩美女写真福利在线观看| 久色乳综合思思在线视频| 久久精品国产一区二区电影| 国产精品亚洲精品| 欧美激情精品久久久久久变态| 97精品久久久中文字幕免费| 国语自产精品视频在免费| 中文字幕亚洲图片| 日韩av在线精品| 国产主播欧美精品| 91精品一区二区| 亚洲国产精品美女| 国产午夜精品麻豆| 亚洲图片在区色| 神马久久桃色视频| 欧美成人剧情片在线观看| 欧美大片在线免费观看| 欧美激情性做爰免费视频| 欧美综合在线第二页| 日本精品久久久久影院| 精品无码久久久久久国产| 欧美极品在线播放| 7777精品久久久久久| 4438全国亚洲精品在线观看视频| 亚洲精品有码在线| 国产精品欧美日韩久久| 日韩精品在线影院| 91手机视频在线观看| 亚洲午夜未满十八勿入免费观看全集| 日韩精品在线电影| 国产脚交av在线一区二区| 91久久精品久久国产性色也91| 日韩av中文字幕在线免费观看| 亚洲一区二区在线| 国产日韩欧美日韩大片| 国产精品国内视频| 成人在线免费观看视视频| 91成品人片a无限观看| 51精品国产黑色丝袜高跟鞋| 中文字幕日本欧美| 法国裸体一区二区| 亚洲高清色综合| 亚洲精品成人久久久| 欧美在线观看一区二区三区| 久久久av一区| 亚洲国产精品嫩草影院久久| 国产日韩欧美在线播放| 九九热视频这里只有精品| 欧美成人久久久| 97超碰色婷婷| 亚洲午夜色婷婷在线| 欧美乱大交xxxxx另类电影| 亚洲另类激情图| 热久久这里只有精品| 亚洲精美色品网站| 国产精品pans私拍| 亚洲国产成人精品一区二区| 久久久电影免费观看完整版| 97精品久久久中文字幕免费| 国产免费一区二区三区香蕉精| 红桃视频成人在线观看| 国产91精品网站| 中文在线资源观看视频网站免费不卡| 国产一区二区丝袜高跟鞋图片| 亚洲天堂免费视频| 亚洲美女av在线| 欧美一区二区视频97| 亚洲日本中文字幕| 日韩亚洲精品电影| 亚洲色在线视频| 亚洲自拍欧美色图| 国产精品99久久久久久久久久久久| 亚洲精品女av网站| 91禁外国网站| 日韩经典一区二区三区| 欧美电影电视剧在线观看| 欧美在线观看一区二区三区| 欧美中文在线免费| 成人网中文字幕| 亚洲欧美日韩久久久久久| 欧美激情手机在线视频| 亚洲人成欧美中文字幕| 欧美一级淫片丝袜脚交| 51色欧美片视频在线观看| 国产91色在线| 亚洲欧美另类人妖| 黄色91在线观看| 国产精品久久久久影院日本| 国产欧美日韩专区发布| 欧美国产日韩一区二区| 欧美激情手机在线视频| 国产色综合天天综合网| 亚洲精品久久久久中文字幕欢迎你| 久久精品视频一| 国产成人在线播放| 亚洲男女自偷自拍图片另类| 91最新在线免费观看| 欧美日韩国产精品一区二区三区四区| 55夜色66夜色国产精品视频| 亚洲国产黄色片| 欧美日韩不卡合集视频| 亚洲国产另类 国产精品国产免费| 日韩av免费观影| 久久这里只有精品视频首页| 日韩欧美在线免费观看| 一道本无吗dⅴd在线播放一区| 91禁国产网站| 欧美激情视频免费观看| 羞羞色国产精品| 日韩av电影手机在线观看| 欧美小视频在线观看| 亚洲精品国产精品国自产在线| 亚洲最新av在线网站| 亚洲理论在线a中文字幕| 亚洲国产精品久久91精品| 久久的精品视频| 亚洲欧美一区二区激情| 精品国产视频在线| 久久久精品国产网站| 国产91露脸中文字幕在线| 日韩欧美在线第一页| 色樱桃影院亚洲精品影院| 国产91精品黑色丝袜高跟鞋| 欧美理论在线观看| 欧美尺度大的性做爰视频| 美女扒开尿口让男人操亚洲视频网站| 欧美亚洲视频在线看网址| 久久久久久高潮国产精品视| 欧美激情亚洲自拍| 日韩激情在线视频| 97香蕉久久夜色精品国产| 欧美午夜片欧美片在线观看| 色悠久久久久综合先锋影音下载| 欧美一区二区三区精品电影| 中文字幕日韩有码| 国产亚洲精品久久久久动| 日韩欧美在线视频免费观看| 欧美激情乱人伦一区| 91po在线观看91精品国产性色|