base64編碼處理大文件


在做項目的時候遇到需要將文件轉為base64編碼,並存儲在文件中。

在將文件轉為base64編碼是會將文件讀入內存,進行base64編碼,輸出到文件中。代碼入下:

   FileInputStream stream = new FileInputStream("D:\\桌面\\程序員-第4版.pdf");
        ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
        byte[] b = new byte[1024];
        int n;
        while ((n = stream.read(b)) != -1) {
            out.write(b, 0, n);
        }
        stream.close();
        out.close();
        System.out.println(new String(Base64.encodeBase64(out.toByteArray())));    

  但是大文件在進行base64編碼的時候就會遇到OOM(OOM為out of memory的簡稱,稱之為內存溢出)。

  產生OOM的原因:

  • 文件太大,超出了內存
  • 文件可以正常讀入內存,由於base64編碼后的文件比原來的文件大1/3,在編碼的過程中超出內存

由於3個常規字符可以轉換為4個base64編碼字符,所以使用3的公倍數作為緩沖區大小。

所以在對大文件進行base64編碼時可以采用分段編碼,進行輸出。代碼入下:

//使用分段上傳的讀取文件的方式將大文件轉換為base64編碼數據
        ByteArrayOutputStream os1 = new ByteArrayOutputStream();
        InputStream file1 = new FileInputStream("D:\\桌面\\程序員-第4版.pdf");
        byte[] byteBuf = new byte[3 * 1024 * 1024];
        byte[] base64ByteBuf;
        int count1; //每次從文件中讀取到的有效字節數
        while ((count1 = file1.read(byteBuf)) != -1) {
            if (count1 != byteBuf.length) {//如果有效字節數不為3*1000,則說明文件已經讀到尾了,不夠填充滿byteBuf了
                byte[] copy = Arrays.copyOf(byteBuf, count1); //從byteBuf中截取包含有效字節數的字節段
                base64ByteBuf = Base64.encodeBase64(copy); //對有效字節段進行編碼
            } else {
                base64ByteBuf = Base64.encodeBase64(byteBuf);
            }
            os1.write(base64ByteBuf, 0, base64ByteBuf.length);
            os1.flush();
        }
        file1.close();
        System.out.println(os1.toString());

  以上代碼是將編碼后的數據輸出至控制台。其實最好是將文件分段進行編碼,分段輸出,這樣不管文件多大,都可以進行編碼,並且不會OOM。以下是將文件輸出至txt文檔中:

 ByteArrayOutputStream os1 = new ByteArrayOutputStream();
        InputStream file1 = new FileInputStream("D:\\桌面\\程序員-第4版.pdf");
        byte[] byteBuf = new byte[3 * 1024 * 1024];
        byte[] base64ByteBuf;
        int count1; //每次從文件中讀取到的有效字節數
        File file = new File("D:\\1.txt");
        while ((count1 = file1.read(byteBuf)) != -1) {
            if (count1 != byteBuf.length) {//如果有效字節數不為3*1000,則說明文件已經讀到尾了,不夠填充滿byteBuf了
                byte[] copy = Arrays.copyOf(byteBuf, count1); //從byteBuf中截取包含有效字節數的字節段
                base64ByteBuf = Base64.encodeBase64(copy); //對有效字節段進行編碼
            } else {
                base64ByteBuf = Base64.encodeBase64(byteBuf);
            }
            FileUtils.writeByteArrayToFile(file, base64ByteBuf, true); // 將轉換后的數據寫入文件中,該方法會自動創建文件
            os1.flush();
        }
        file1.close();

  本文參考文檔:https://blog.csdn.net/u014248939/article/details/53205030/

base64解碼大文件請參考:https://blog.csdn.net/GAMEloft9/article/details/88536661,沒有實際操作,原理上應該是可以的。

 

  

 

 

 

 


免責聲明!

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



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