在作项目的时候遇到须要将文件转为base64编码,并存储在文件中。程序员

在将文件转为base64编码是会将文件读入内存,进行base64编码,输出到文件中。代码入下:编码

1spa

2code

3内存

4ci

5文档

6it

7base64

8table

9

10

FileInputStream stream =new FileInputStream("D:\\桌面\\程序员-第4版.pdf");

ByteArrayOutputStreamout =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编码时能够采用分段编码,进行输出。代码入下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

//使用分段上传的读取文件的方式将大文件转换为base64编码数据 官网 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;//每次从文件中读取到的有效字节数

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文档中:

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;//每次从文件中读取到的有效字节数

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();

android转base64内存溢出,base64编码处理大文件相关推荐

  1. android bitmap.createbitmap内存溢出,android bitmap oom 优化

    android使用位图显示图片,也就是像素点,jpg之类的压缩格式在android都会转成bitmap. 现在手机的分辨率也越来越高,480*800 大小的图片使用的内存大小: 480*800*32/ ...

  2. 关于 android oom(内存溢出的分析)

    laozhu1124 android oom 全解析 Android oom 有时出现很频繁,这一般不是Android设计的问题,一般是我们的问题. 就我的经验而言,出现oom,无非主要是以下几个方面 ...

  3. spark如何防止内存溢出_spark开发十大原则

    前言 本文主要阐述的是在开发spark的时候遵循十大开发原则,这些原则都是我们的前辈辛辛苦苦的总结而来,但是也不是凭空创造的,是有依据可循的,就在官网上面,让我们来认识一下吧. 网址:http://s ...

  4. JVM参数之-XX:+HeapDumpOnOutOfMemoryError(导出内存溢出的堆信息(hprof文件))

    当出现HeapDumpOnOutOfMemoryError错误时,我们需要分析原因,下面的程序就是模拟这个错误并导出dump文件,好让你分析 GcTest.java package gc; publi ...

  5. 生产内存溢出,通过jprofiler对dump文件进行分析

    选择"Open Snapshot",点击"Open a single Snapshot "加载dump文件. 若dump文件jProfiler无法识别,则可以直 ...

  6. 多线程处理大文件_Java内存映射,上G大文件轻松处理

    ☞ 免费CSDN资料帮下服务 | 免费加群 ☜ 内存映射文件(Memory-mapped File),指的是将一段虚拟内存逐字节映射于一个文件,使得应用程序处理文件如同访问主内存(但在真正使用到这些数 ...

  7. android 动画 图片 内存溢出,Android有效解决加载大图片时内存溢出的问题

    尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图, 因为这些函数在完成decode后,最终都是通过ja ...

  8. PHP合并大文件 高性能 低内存 低CPU 快速合并大文件 非耗时操作 快速合并PDF等影视大文件...

    为什么80%的码农都做不了架构师?>>>    <?php$command = 'pdftk 1.pdf 2.pdf 3.pdf cat output 123.pdf';$re ...

  9. Android中的内存泄漏和内存溢出

    一.内存泄漏 1.内存泄漏的现象和本质 内存泄漏(Memory Leak)是指某些对象已经不再使用了,但却无法被垃圾回收器回收内存,还一直占用着内存空间的现象,这就导致这一块内存泄露了. 而垃圾回收器 ...

最新文章

  1. Windows Server 2008壮烈牺牲
  2. 网管师、网管员和网络工程师的区别(2)
  3. 人生时间计算器_工具拯救效率,高效拯救人生!70个全国工程人实用小工具+算量表格...
  4. 使用共享网口方式访问BMC管理控制器
  5. 如何给领导打造一款掌上财务管理驾驶舱?
  6. 你所不知的 CSS ::before 和 ::after 伪元素用法
  7. ★LeetCode(39)——组合总和(JavaScript)
  8. promise的状态值_ES6中的Promise的用法总结
  9. C#基础回顾:正则表达式
  10. LeetCode 404 左叶子之和
  11. 4月10日服务器例行维护公告,4月12日服务器例行维护公告(已完成)
  12. 单体民宿小程序开发运营方案
  13. QCheckBox::toggled(bool)和QCheckBox::clicked(bool)的区别
  14. 欧拉计划26--Reciprocal cycles
  15. 【向生活低头】如何在Gold Wave软件中为声音添加背景音乐
  16. ORA-01830: date format picture ends before converting entire input string的几种原因
  17. C#高级编程面试考题
  18. 如何使用C#调用淘宝网页自动搜索,翻页和点击商品
  19. Vue学习7-MinUI组件与项目托管到码云上
  20. 性能测试分析之应用程序减少TCP压力

热门文章

  1. Tor 浏览器存在严重漏洞 或泄露用户真实 IP 地址
  2. edu-【Linux 与 Python编程2021】Linux知识训练,Linux之用户管理,Linux文件/目录管理
  3. matplotlib中cmap_cmap到Matplotlib中的rgba
  4. 2021年起重机械指挥考试及起重机械指挥考试试卷
  5. 锅炉废气监测 环保数采仪自动监测 告警预警 工况监测
  6. excel字母数字排序_Excel数字不能正确排序或添加
  7. 全球与中国化学机械抛光研磨材料行业市场深度分析及发展战略咨询报告2022-2028年
  8. FPGA入门学习笔记(五)Vivado模块化设计
  9. win10下pip配置国内源
  10. Android监听系统广播 和自定义广播遇到的问题