最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中使用內(nèi)存映射實(shí)現(xiàn)大文件上傳實(shí)例

 更新時(shí)間:2015年01月14日 11:53:17   投稿:junjie  
這篇文章主要介紹了Java中使用內(nèi)存映射實(shí)現(xiàn)大文件上傳實(shí)例,本文對(duì)比測(cè)試了FileInputStream 或者FileOutputStream 抑或RandomAccessFile的頻繁讀寫(xiě)操作,最后總結(jié)出映射到內(nèi)存后進(jìn)行讀寫(xiě)以提高速度,需要的朋友可以參考下

在處理大文件時(shí),如果利用普通的FileInputStream 或者FileOutputStream 抑或RandomAccessFile 來(lái)進(jìn)行頻繁的讀寫(xiě)操作,都將導(dǎo)致進(jìn)程因頻繁讀寫(xiě)外存而降低速度.如下為一個(gè)對(duì)比實(shí)驗(yàn)。

復(fù)制代碼 代碼如下:

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(); 
        } 

    } 

}


測(cè)試文件為一個(gè)大小為1253244字節(jié)的文件。測(cè)試結(jié)果:
復(fù)制代碼 代碼如下:

sum:220152087 time:1464 
sum:220152087 time:72 
sum:220152087 time:25

說(shuō)明讀數(shù)據(jù)無(wú)誤。刪去其中的數(shù)據(jù)處理部分。
復(fù)制代碼 代碼如下:

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(); 
        } 

    } 

}


測(cè)試結(jié)果:
復(fù)制代碼 代碼如下:

sum:0 time:1458 
sum:0 time:67 
sum:0 time:8

由此可見(jiàn),將文件部分或者全部映射到內(nèi)存后進(jìn)行讀寫(xiě),速度將提高很多。

這是因?yàn)閮?nèi)存映射文件首先將外存上的文件映射到內(nèi)存中的一塊連續(xù)區(qū)域,被當(dāng)成一個(gè)字節(jié)數(shù)組進(jìn)行處理,讀寫(xiě)操作直接對(duì)內(nèi)存進(jìn)行操作,而后再將內(nèi)存區(qū)域重新映射到外存文件,這就節(jié)省了中間頻繁的對(duì)外存進(jìn)行讀寫(xiě)的時(shí)間,大大降低了讀寫(xiě)時(shí)間。

相關(guān)文章

  • 解決JavaWeb-file.isDirectory()遇到的坑問(wèn)題

    解決JavaWeb-file.isDirectory()遇到的坑問(wèn)題

    JavaWeb開(kāi)發(fā)中,使用`file.isDirectory()`判斷路徑是否為文件夾時(shí),需要特別注意:該方法只能判斷已存在的文件夾,若路徑不存在,無(wú)論其實(shí)際是否應(yīng)為文件夾,均會(huì)返回`false`,為了解決這個(gè)問(wèn)題,可以采用正則表達(dá)式進(jìn)行判斷,但要求路徑字符串的結(jié)尾必須添加反斜杠(\)
    2025-02-02
  • Java解決前端數(shù)據(jù)處理及亂碼問(wèn)題

    Java解決前端數(shù)據(jù)處理及亂碼問(wèn)題

    大伙們有沒(méi)有遇到數(shù)據(jù)亂碼的問(wèn)題,真的是讓人心情煩躁,今天就來(lái)教下大家數(shù)據(jù)怎么傳輸?shù)角岸艘约皝y碼問(wèn)題怎么解決的,需要的朋友可以參考一下
    2021-12-12
  • SpringBoot 單元測(cè)試JUnit的使用詳解

    SpringBoot 單元測(cè)試JUnit的使用詳解

    這篇文章主要介紹了SpringBoot 單元測(cè)試JUnit的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 解決mybatis-plus自定義xml的坑

    解決mybatis-plus自定義xml的坑

    這篇文章主要介紹了解決mybatis-plus自定義xml的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • JAVA通過(guò)HttpURLConnection 上傳和下載文件的方法

    JAVA通過(guò)HttpURLConnection 上傳和下載文件的方法

    這篇文章主要介紹了JAVA通過(guò)HttpURLConnection 上傳和下載文件的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-09-09
  • Java中List與數(shù)組相互轉(zhuǎn)換實(shí)例分析

    Java中List與數(shù)組相互轉(zhuǎn)換實(shí)例分析

    這篇文章主要介紹了Java中List與數(shù)組相互轉(zhuǎn)換的方法,實(shí)例分析了Java中List與數(shù)組相互轉(zhuǎn)換中容易出現(xiàn)的問(wèn)題與相關(guān)的解決方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-05-05
  • 深入解析Jdk8中Stream流的使用讓你脫離for循環(huán)

    深入解析Jdk8中Stream流的使用讓你脫離for循環(huán)

    這篇文章主要介紹了Jdk8中Stream流的使用,讓你脫離for循環(huán),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Java中notify()和notifyAll()的使用區(qū)別

    Java中notify()和notifyAll()的使用區(qū)別

    本文主要介紹了Java中notify()和notifyAll()的使用區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),感興趣的小伙伴們可以參考一下
    2021-06-06
  • springboot項(xiàng)目中實(shí)現(xiàn)訪問(wèn)druid內(nèi)置監(jiān)控頁(yè)面

    springboot項(xiàng)目中實(shí)現(xiàn)訪問(wèn)druid內(nèi)置監(jiān)控頁(yè)面

    這篇文章主要介紹了springboot項(xiàng)目中實(shí)現(xiàn)訪問(wèn)druid內(nèi)置監(jiān)控頁(yè)面的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java簡(jiǎn)單實(shí)現(xiàn)猜數(shù)字游戲附C語(yǔ)言版本

    Java簡(jiǎn)單實(shí)現(xiàn)猜數(shù)字游戲附C語(yǔ)言版本

    猜數(shù)字是興起于英國(guó)的益智類小游戲,起源于20世紀(jì)中期,一般由兩個(gè)人或多人玩,也可以由一個(gè)人和電腦玩。游戲規(guī)則為一方出數(shù)字,一方猜,今天我們來(lái)用Java和C語(yǔ)言分別把這個(gè)小游戲?qū)懗鰜?lái)練練手
    2021-11-11

最新評(píng)論

定日县| 怀化市| 岢岚县| 银川市| 黄浦区| 滕州市| 社旗县| 綦江县| 海口市| 德江县| 乃东县| 安阳县| 巢湖市| 平利县| 民乐县| 潞西市| 眉山市| 海伦市| 隆德县| 驻马店市| 江达县| 长阳| 康马县| 全州县| 鸡东县| 和林格尔县| 永德县| 南开区| 沅江市| 桦甸市| 分宜县| 美姑县| 连山| 长沙县| 青铜峡市| 青川县| 漾濞| 拉孜县| 曲麻莱县| 土默特左旗| 长丰县|