当前位置: 首页 > 面试题库 >

将文件编码为base64时内存不足

章增
2023-03-14
问题内容

从Apache Commons使用Base64

public byte[] encode(File file) throws FileNotFoundException, IOException {
        byte[] encoded;
        try (FileInputStream fin = new FileInputStream(file)) {
            byte fileContent[] = new byte[(int) file.length()];
            fin.read(fileContent);
            encoded = Base64.encodeBase64(fileContent);
        }
        return encoded;   
}


Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space
    at org.apache.commons.codec.binary.BaseNCodec.encode(BaseNCodec.java:342)
    at org.apache.commons.codec.binary.Base64.encodeBase64(Base64.java:657)
    at org.apache.commons.codec.binary.Base64.encodeBase64(Base64.java:622)
    at org.apache.commons.codec.binary.Base64.encodeBase64(Base64.java:604)

我正在为移动设备制作小型应用程序。


问题答案:

您不能像下面这样将整个文件加载到内存中:

byte fileContent[] = new byte[(int) file.length()];
fin.read(fileContent);

而是逐块加载文件并对其进行部分编码。Base64是一种简单的编码,一次加载3个字节并对其进行编码就足够了(编码后将产生4个字节)。出于性能原因,请考虑加载3字节的倍数,例如3000字节-
应该很好。还可以考虑缓冲输入文件。

一个例子:

byte fileContent[] = new byte[3000];
try (FileInputStream fin = new FileInputStream(file)) {
    while(fin.read(fileContent) >= 0) {
         Base64.encodeBase64(fileContent);
    }
}

请注意,您不能简单地将结果附加Base64.encodeBase64()encodedbbyte数组。实际上,它没有加载文件,而是将其编码为Base64,从而导致内存不足的问题。这是可以理解的,因为Base64版本更大(并且您已经有一个占用大量内存的文件)。

考虑将您的方法更改为:

public void encode(File file, OutputStream base64OutputStream)

并将Base64编码的数据直接发送到base64OutputStream而不是将其返回。

更新:感谢 @StephenC, 我开发了更简单的版本:

public void encode(File file, OutputStream base64OutputStream) {
  InputStream is = new FileInputStream(file);
  OutputStream out = new Base64OutputStream(base64OutputStream)
  IOUtils.copy(is, out);
  is.close();
  out.close();
}

它使用Base64OutputStream它将输入 实时
转换为Base64
以及IOUtils来自Apache
Commons IO的类。

注意:如果需要,您必须关闭FileInputStreamBase64OutputStream显式打印=,但是缓冲由处理IOUtils.copy()



 类似资料:
  • 我知道如何编码/解码一个简单的字符串到/从Base64。 也许你们中有人知道更好的解决办法?我可以将FileStream转换成一个字符串,对该字符串进行编码,然后将该字符串转换回FileStream,例如,或者我会怎么做,这样的代码看起来是什么样子的?

  • 我有一个编码为base64的SVG文件,我想用ImageView显示图像。这是我尝试过的: 但是decodedByte总是返回null。 附注: 此代码适用于jpeg图像。 如果Bas64字符串包含Bas64前缀("data: Image/svg xml; Bas64,"或"data: Image/jpeg; Bas64,),则decdedByte也总是返回null Bas64字符串是正确的(它在

  • 介绍 Base64编码是用64(2的6次方)个ASCII字符来表示256(2的8次方)个ASCII字符,也就是三位二进制数组经过编码后变为四位的ASCII字符显示,长度比原来增加1/3。 使用 String a = "伦家是一个非常长的字符串"; //5Lym5a625piv5LiA5Liq6Z2e5bi46ZW/55qE5a2X56ym5Liy String encode = Base64.en

  • 我需要在Java的Base64编码中编码一些数据。我该怎么做?提供Base64编码器的类的名称是什么? 我尝试使用类,但没有成功。我有下面一行Java七号的代码: 我在用Eclipse。Eclipse将这一行标记为错误。我导入了所需的库: 但是,它们都显示为错误。我在这里发现了一个类似的帖子。 我使用Apache Commons作为建议的解决方案,包括: 并导入从以下网址下载的JAR文件:http