java中write(byte[] b)與write(byte[] b,int off,int len)區別


在項目中要上傳文件或者圖片

private static final int BUFFER_SIZE = 16 * 1024;

private static void copy(File src, File dst) {

        try {

            InputStream in = null;

            OutputStream ut = null;

            try {

                in = new BufferedInputStream(new FileInputStream(src), BUFFER_SIZE);

                ut = new BufferedOutputStream(new FileOutputStream(dst), BUFFER_SIZE);

                byte[] buffer = new byte[BUFFER_SIZE];

                while (in.read(buffer) > 0) {

                    out.write(buffer);

                }

            } catch (Exception e) {

                e.printStackTrace();

            } finally {

                if (null != in) {

                    in.close();

                }

                if (null != out) {

                    out.close();

                }

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

 

文件上傳很簡單就實現了,可是突然我發現上傳的文件都比原來大十幾K.由於系統用戶量很大,如果有一百萬張,那占的空間可非常大了,查看jdk文檔,其中在BufferedOutputStream文檔中有write(byte[] b, int off, int len)和write(byte[] b).其中write(byte[ ] b,int off,int len)注釋為:

       將指定 byte 數組中從偏移量off開始的len個字節寫入此緩沖的輸出流。一般來說,此方法將給定數組的字節存入此流的緩沖區中,根據需要將該緩沖區刷新,並轉到底層輸出流。但是,如果請求的長度至少與此流的緩沖區大小相同,則此方法將刷新該緩沖區並將各個字節直接寫入底層輸出流。因此多余的BufferedOutputStream將不必復制數據。

       果然我試了write(byte[ ] b,int off,int len)方法文件沒有變大.由於習慣,在跟蹤下去看看是究竟怎么回事.最后發現write(byte[ ]) 是調用了write(byte[] b,int off,int len),其中len數組的長度.問題就出在這里.在最后一次寫入流時,len一般不會為讀入字節的長度.除非文件大小剛好被BUFFER_SIZE整除.而通過 while ((len = in.read(buffer)) > 0){write(byte[] b,int off,int len) ,其中len為實際讀入流的字節長度.所以這個方法不會增加文件大小,不會把多余的字節寫進去.

       也不知道為什么sun在Java中增加了write(byte[] b) 方法,不過該方法不會影響文件.當我用MagickImage處理一把,文件就恢復原樣了.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM