溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

base64編碼處理大文件

發布時間:2020-06-23 23:17:52 來源:網絡 閱讀:1260 作者:16521544193 欄目:編程語言

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

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

1
2
3
4
5
6
7
8
9
10
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編碼時可以采用分段編碼,進行輸出。代碼入下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//使用分段上傳的讀取文件的方式將大文件轉換為base64編碼數據?官網 www.1b23.com
????????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文檔中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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();


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女