真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

base64編碼處理大文件

在做項(xiàng)目的時(shí)候遇到需要將文件轉(zhuǎn)為base64編碼,并存儲(chǔ)在文件中。

創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的資興網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

在將文件轉(zhuǎn)為base64編碼是會(huì)將文件讀入內(nèi)存,進(jìn)行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())));???

但是大文件在進(jìn)行base64編碼的時(shí)候就會(huì)遇到OOM(OOM為out of memory的簡(jiǎn)稱,稱之為內(nèi)存溢出)。

產(chǎn)生OOM的原因:

  • 文件太大,超出了內(nèi)存

  • 文件可以正常讀入內(nèi)存,由于base64編碼后的文件比原來的文件大1/3,在編碼的過程中超出內(nèi)存

由于3個(gè)常規(guī)字符可以轉(zhuǎn)換為4個(gè)base64編碼字符,所以使用3的公倍數(shù)作為緩沖區(qū)大小。

所以在對(duì)大文件進(jìn)行base64編碼時(shí)可以采用分段編碼,進(jìn)行輸出。代碼入下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//使用分段上傳的讀取文件的方式將大文件轉(zhuǎn)換為base64編碼數(shù)據(jù)?官網(wǎng) 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;?//每次從文件中讀取到的有效字節(jié)數(shù)
????????while?((count1 = file1.read(byteBuf)) != -1) {
????????????if?(count1 != byteBuf.length) {//如果有效字節(jié)數(shù)不為3*1000,則說明文件已經(jīng)讀到尾了,不夠填充滿byteBuf了
????????????????byte[] copy = Arrays.copyOf(byteBuf, count1);?//從byteBuf中截取包含有效字節(jié)數(shù)的字節(jié)段
????????????????base64ByteBuf = Base64.encodeBase64(copy);?//對(duì)有效字節(jié)段進(jìn)行編碼
????????????}?else?{
????????????????base64ByteBuf = Base64.encodeBase64(byteBuf);
????????????}
????????????os1.write(base64ByteBuf, 0, base64ByteBuf.length);
????????????os1.flush();
????????}
????????file1.close();
????????System.out.println(os1.toString());

以上代碼是將編碼后的數(shù)據(jù)輸出至控制臺(tái)。其實(shí)最好是將文件分段進(jìn)行編碼,分段輸出,這樣不管文件多大,都可以進(jìn)行編碼,并且不會(huì)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;?//每次從文件中讀取到的有效字節(jié)數(shù)
???????File file =?new?File("D:\\1.txt");
???????while?((count1 = file1.read(byteBuf)) != -1) {
???????????if?(count1 != byteBuf.length) {//如果有效字節(jié)數(shù)不為3*1000,則說明文件已經(jīng)讀到尾了,不夠填充滿byteBuf了
???????????????byte[] copy = Arrays.copyOf(byteBuf, count1);?//從byteBuf中截取包含有效字節(jié)數(shù)的字節(jié)段
???????????????base64ByteBuf = Base64.encodeBase64(copy);?//對(duì)有效字節(jié)段進(jìn)行編碼
???????????}?else?{
???????????????base64ByteBuf = Base64.encodeBase64(byteBuf);
???????????}
???????????FileUtils.writeByteArrayToFile(file, base64ByteBuf,?true);?// 將轉(zhuǎn)換后的數(shù)據(jù)寫入文件中,該方法會(huì)自動(dòng)創(chuàng)建文件
???????????os1.flush();
???????}
???????file1.close();

本文題目:base64編碼處理大文件
分享地址:http://weahome.cn/article/jjgohp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部