从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()
到encoded
bbyte数组。实际上,它没有加载文件,而是将其编码为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的类。
注意:如果需要,您必须关闭FileInputStream
和Base64OutputStream
显式打印=
,但是缓冲由处理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