您好,欢迎来到网暖!

当前位置:网暖 » 站长资讯 » 建站基础 » 网络技术 » 文章详细 订阅RssFeed

base64编码处理大文件

来源:网络整理 浏览:277次 时间:2020-04-05

在做项目的时候遇到需要将文件转为base64编码,并存储在文件中。

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

12345678910FileInputStream 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编码时可以采用分段编码,进行输出。代码入下:

123456789101112131415161718//使用分段上传的读取文件的方式将大文件转换为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文档中:

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


推荐站点

  • 腾讯腾讯

    腾讯网(www.QQ.com)是中国浏览量最大的中文门户网站,是腾讯公司推出的集新闻信息、互动社区、娱乐产品和基础服务为一体的大型综合门户网站。腾讯网服务于全球华人用户,致力成为最具传播力和互动性,权威、主流、时尚的互联网媒体平台。通过强大的实时新闻和全面深入的信息资讯服务,为中国数以亿计的互联网用户提供富有创意的网上新生活。

    www.qq.com
  • 搜狐搜狐

    搜狐网是全球最大的中文门户网站,为用户提供24小时不间断的最新资讯,及搜索、邮件等网络服务。内容包括全球热点事件、突发新闻、时事评论、热播影视剧、体育赛事、行业动态、生活服务信息,以及论坛、博客、微博、我的搜狐等互动空间。

    www.sohu.com
  • 网易网易

    网易是中国领先的互联网技术公司,为用户提供免费邮箱、游戏、搜索引擎服务,开设新闻、娱乐、体育等30多个内容频道,及博客、视频、论坛等互动交流,网聚人的力量。

    www.163.com
  • 新浪新浪

    新浪网为全球用户24小时提供全面及时的中文资讯,内容覆盖国内外突发新闻事件、体坛赛事、娱乐时尚、产业资讯、实用信息等,设有新闻、体育、娱乐、财经、科技、房产、汽车等30多个内容频道,同时开设博客、视频、论坛等自由互动交流空间。

    www.sina.com.cn
  • 百度一下百度一下

    百度一下,你就知道

    www.baidu.com