java擷取檔案大小的方法

來源:互聯網
上載者:User

標籤:getname   close   channel   流式   window   線上轉換   9.png   ram   void   

目前Java擷取檔案大小的方法有兩種:

1、通過file的length()方法擷取;

2、通過流式方法擷取;

通過流式方法又有兩種,分別是舊的java.io.*中FileInputStream的available()方法和新的java..nio.*中的FileChannel

下面依次介紹這幾種方法:

首先選擇一個檔案並查看這個檔案在windows中顯示的大小,為了測試準確性,我這裡選取了一個大檔案(超過2GB)

查看這個檔案在windows中顯示的大小:

使用線上轉換工具將其轉換成位元組:

可以看出這個檔案的實際大小是3265574912Byte,下面通過代碼來擷取檔案大小,並進行比較:

一、通過length方法:

1、建立一個檔案:

1 File file = new File("E:\\全部軟體\\軟體壓縮包\\Windows7_W64_SP1_ent.iso");

2、擷取檔案大小:

    /**     * 擷取檔案長度     * @param file     */    public static void getFileSize1(File file) {        if (file.exists() && file.isFile()) {            String fileName = file.getName();            System.out.println("檔案"+fileName+"的大小是:"+file.length());        }    }

3、查看結果:

可見,使用length方法擷取的檔案大小與windows中顯示的大小一致!

二、通過file.io.*中的流式方法擷取

1、建立一個檔案

依舊使用上面的檔案

File file = new File("E:\\全部軟體\\軟體壓縮包\\Windows7_W64_SP1_ent.iso");

2、使用available方法擷取:

/**     * 根據java.io.*的流擷取檔案大小     * @param file     */    public static void getFileSize2(File file){        FileInputStream fis  = null;        try {            if(file.exists() && file.isFile()){                String fileName = file.getName();                fis = new FileInputStream(file);                System.out.println("檔案"+fileName+"的大小是:"+fis.available()+"\n");            }        } catch (Exception e) {            e.printStackTrace();        }finally{            if(null!=fis){                try {                    fis.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }

3、查看結果:

通過這種方法擷取的檔案大小是2147483647,很明顯,這是int類型所能表示的最大值2^31-1,究其原因是因為檔案的大小超過了int所能表示的最大值!!!

file.length()方法返回的類型:

available()方法返回的類型:

三、通過file.nio.*中的FileChannel工具來擷取檔案大小:

1、建立一個檔案

依舊使用相同的大檔案:

File file1 = new File("E:\\全部軟體\\軟體程式\\httpwatch.exe");

2、使用FileChannel擷取檔案大小:

    /**     * 根據java.nio.*的流擷取檔案大小     * @param file     */    public static void getFileSize3(File file){        FileChannel fc = null;        try {            if(file.exists() && file.isFile()){                String fileName = file.getName();                FileInputStream fis = new FileInputStream(file);                fc = fis.getChannel();                System.out.println("檔案"+fileName+"的大小是:"+fc.size()+"\n");            }        } catch (Exception e) {            e.printStackTrace();        }finally{            if(null!=fc){                try {                    fc.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }

3、查看結果:

可見通過這種方法擷取的檔案大小和第一種一樣,都能擷取檔案實際大小。

四、使用小檔案測試以上三種方法:

以上情況中檔案大小超過了available()傳回型別int的最大值,下面使用一個沒有超過int最大值的檔案測試,來驗證通過這三種方法擷取的大小是否和windows中顯示的一致:

1、擷取檔案,查看其在windows中的大小:

2、將該檔案單位轉成Byte:

可見該檔案總共有28147712個位元組。

3、查看通過三種方法擷取的結果:

根據結果得知,三種方法擷取的大小一致,只是跟檔案的實際大小有一些誤差!!

本以為是檔案類型的原因,於是又試了大小差不多的不同類型檔案,結果發現絕大多數情況下只有300M以上的檔案才能擷取最準確的檔案大小,300M以下的都會有一定的誤差!

參考了http://blog.csdn.net/chaijunkun/article/details/22387305這篇文章,但是裡面沒測試300M以下的檔案。

下面是我使用不同大小的檔案進行的測試,通過檔案在windows中顯示的大小、轉化成單位Byte後與java擷取的方式對比,並計算出誤差值:

總結java擷取檔案大小:

1、三種方法擷取小檔案(300M以下)時結果一致,但是與windows顯示的值有一定誤差;

2、擷取大檔案時,為避免檔案長度大於方法傳回值類型的最大值,盡量使用length或FileChannel方法擷取;

 

如果看到這篇文章的你對此文有質疑,歡迎提出疑問~

java擷取檔案大小的方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.