我想将一个文件拆分成多个块(在这种情况下,尝试长度为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”并用它填满整个控制台,并且新文件在解码时被破坏。可能导致此错误的原因是什么?
答案 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