当前位置: 移动技术网 > IT编程>开发语言>Java > base64编码处理大文件

base64编码处理大文件

2019年10月15日  | 移动技术网IT编程  | 我要评论
在做项目的时候遇到需要将文件转为base64编码,并存储在文件中。 在将文件转为base64编码是会将文件读入内存,进行base64编码,输出到文件中。代码入下: 但是大文件在进行base64编码的时候就会遇到OOM(OOM为out of memory的简称,称之为内存溢出)。 产生OOM的原因: ...

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

  本文参考文档:

 

  

 

 

 

 

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网