Base64按块编码文件

时间:2015-08-14 01:59:16

标签: java base64

我想将一个文件拆分成多个块(在这种情况下,尝试长度为300)并对其进行base64编码,因为在将base64编码时,将整个文件加载到内存会产生负数组异常。我尝试使用以下代码:

int offset = 0;
bis = new BufferedInputStream(new FileInputStream(f));
while(offset + 300 <= f.length()){
    byte[] temp = new byte[300];
    bis.skip(offset);
    bis.read(temp, 0, 300);
    offset += 300;
    System.out.println(Base64.encode(temp));
}
if(offset < f.length()){
    byte[] temp = new byte[(int) f.length() - offset];
    bis.skip(offset);
    bis.read(temp, 0, temp.length);
    System.out.println(Base64.encode(temp));
}

起初它似乎正在工作,但是,有一次它切换到只打印出“AAAAAAAAA”并用它填满整个控制台,并且新文件在解码时被破坏。可能导致此错误的原因是什么?

1 个答案:

答案 0 :(得分:2)

skip()&#34;从输入流&#34;中跳过并丢弃n个字节的数据,read()返回&#34;读取的字节数&#34;。

所以,你读取一些字节,跳过一些字节,读取更多,跳过,....最终到达EOF,此时read()返回-1,但你忽略它并使用{{{ 1}}包含所有0,然后编码到所有A&#39;

您的代码应为:

temp

此代码重用循环前分配的单个缓冲区,因此它也会导致比代码少得多的垃圾回收。

如果try (InputStream in = new BufferedInputStream(new FileInputStream(f))) { int len; byte[] temp = new byte[300]; while ((len = in.read(temp)) > 0) System.out.println(Base64.encode(temp, 0, len)); } 没有3参数版本,请执行以下操作:

Base64.encode