在做项目的时候遇到需要将文件转为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/

base64解码大文件请参考:https://blog.csdn.net/GAMEloft9/article/details/88536661,没有实际操作,原理上应该是可以的。

  

base64编码处理大文件的更多相关文章

  1. 从Base64编码转换为图片文件

    package luckyclient.utils;import java.io.FileInputStream;import java.io.FileOutputStream;import java ...

  2. 媒体文件audio 转 base64 编码 (利用 FileReader & Audio 对象)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. base64编码后的pdf文件前端页面展示--pdf.js的应用

    最近在整理项目中用到的插件或者使用心得,感觉还是写成博客,能加深新一层的理解. 我先说一下我的需求:由于java后台编译的文件流在手机端加载速度太慢,所以想着可以在前端解析,放在页面展示给用户. 所以 ...

  4. 减少HTTP请求之将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片(大型网站优化技术)

    在网站开发过程中,对于页面的加载效率一般都想尽办法求快.那么,怎么让才能更快呢?减少页面请求 是一个优化页面加载速度很好的方法.上一篇博文我们讲解了 “利用将小图标合成一张背景图来减少HTTP请求”, ...

  5. tp5+layui 实现上传大文件

    前言: 之前所写的文件上传类通常进行考虑的是文件的类型.大小是否符合要求条件.当上传大文件时就要考虑到php的配置和服务器的配置问题.之前简单的觉得只要将php.ini中的表单上传的 大小,单脚本执行 ...

  6. 通过json传递图片(base64编码)

    程序一: 后台代码: public ActionResult Index() { FileStream fs = new FileStream("e:\\file\\psb.jpg" ...

  7. Java Base64编码与图片互转

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...

  8. Base64编码与图片互转

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...

  9. .NET实现字符串base64编码

    using System; using System.Text; using System.IO; using System.Security; using System.Security.Crypt ...

随机推荐

  1. js回调函数(callback)(转载)

    学习jquery时,对回调函数感觉很困惑,在晚上找了半天,忽然发现这篇文章很浅显,基本说明了问题.故转载 原文: 自学jquery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速go ...

  2. Mac下持续集成-查看占用的端口及kill

    (base) localhost:~ ligaijiang$ lsof -i tcp:8080 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME Q ...

  3. ajax修改表单的值后dom没更新的解决办法

    添加一个扩展方法,通过$("#id").html($("#id").formhtml())更改. 扩展方法: (function ($) { var oldHT ...

  4. UML 2.5版本与UML分类概述

    UML 2.5版本与UML分类概述 转 http://www.umlstudy.com/uml-25-diagrams.html UML简述 UML图是设计.实现或已经存在的系统模型的部分图形表示(视 ...

  5. springmvc快速入门(注解版本)

    1)springmvc快速入门(传统版) 步一:创建springmvc-day02这么一个web应用 步二:导入springioc,springweb和springmvc相关的jar包 ------- ...

  6. 01 MySQL之数据库基本操作

    01-介绍 数据库(DataBase,DB)是一个长期存储在计算机内的.有组织的.有共享的.统一管理的数据集合. 02-基本操作 2.1 创建数据库 # 查看当前所有的数据库 show databas ...

  7. MySQL主从双向同步

    最近部署测试环境,涉及到MySQL数据库主从双向同步的部署,记录一下部署过程,正常读写都发生在主库,从库作为备选数据库(热备份),当主库发生异常,数据库自动切换到从库,这里面是怎么监控数据库异常并触发 ...

  8. Hadoop、spark

    http://blog.csdn.net/u011204847/article/details/51355272

  9. wpf相关好资源

    Textbox Drag/Drop in WPFhttp://www.codeproject.com/Articles/42696/Textbox-Drag-Drop-in-WPF.aspx Odys ...

  10. es6 实现双链表

    const util = require('util'); /** * 链表节点类 */ class Node { constructor (ele) { this.ele = ele; this.n ...