在做項目的時候遇到需要將文件轉(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)