base64编码处理大文件
2019-10-16 08:10:47来源:博客园 阅读 ()
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/
原文链接:https://www.cnblogs.com/hww-2429/p/11675853.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Spring Cloud Gateway 全局通用异常处理 2020-06-08
- 聊聊 OAuth 2.0 的 Token 续期处理 2020-06-08
- 架构设计 | 异步处理流程,多种实现模式详解 2020-06-04
- SpringCloud异常处理统一封装我来做-使用篇 2020-05-23
- 字符串 2020-05-18
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash