成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

base64編碼處理大文件

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

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

在將文件轉(zhuǎn)為base64編碼是會將文件讀入內(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編碼的時候就會遇到OOM(OOM為out of memory的簡稱,稱之為內(nèi)存溢出)。

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

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

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

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

所以在對大文件進(jìn)行base64編碼時可以采用分段編碼,進(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);?//對有效字節(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ù)輸出至控制臺。其實最好是將文件分段進(jìn)行編碼,分段輸出,這樣不管文件多大,都可以進(jìn)行編碼,并且不會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);?//對有效字節(jié)段進(jìn)行編碼
???????????}?else?{
???????????????base64ByteBuf = Base64.encodeBase64(byteBuf);
???????????}
???????????FileUtils.writeByteArrayToFile(file, base64ByteBuf,?true);?// 將轉(zhuǎn)換后的數(shù)據(jù)寫入文件中,該方法會自動創(chuàng)建文件
???????????os1.flush();
???????}
???????file1.close();

文章題目:base64編碼處理大文件
文章網(wǎng)址:http://jinyejixie.com/article48/jjgohp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、動態(tài)網(wǎng)站網(wǎng)站策劃、網(wǎng)站設(shè)計、服務(wù)器托管、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)頁設(shè)計公司
苍南县| 新绛县| 安乡县| 远安县| 福海县| 靖远县| 满城县| 通州区| 九龙县| 柘城县| 三明市| 河西区| 尼玛县| 西华县| 弥渡县| 乐昌市| 宁河县| 武胜县| 西和县| 新泰市| 蛟河市| 宣汉县| 中西区| 姜堰市| 宁远县| 灵武市| 万全县| 邵武市| 武陟县| 宜春市| 湘阴县| 珠海市| 遂溪县| 大英县| 洪雅县| 武宣县| 勐海县| 九龙坡区| 祁连县| 墨竹工卡县| 西峡县|