我正在处理非常大的文件(>2Ig(。每个输入文件都是Base64编码的,解码后我将输出到新文件。根据缓冲区大小(LARGE_BUF(和给定的输入文件,我的输入到输出转换要么运行良好,要么缺少一个或多个字节,要么在outputStream.write行引发异常(IllegalArgumentException:最后一个单元没有足够的位(。以下是代码片段(无法剪切和粘贴,所以我的代码不完美(:
.
.
final int LARGE_BUF = 1024;
byte[] inBuf = new byte[LARGE_BUF];
try(InputStream inputStream = new FileInputStream(inFile); OutputStream outStream new new FileOutputStream(outFile)) {
for(int len; (len = inputStream.read(inBuf)) > 0); ) {
String out = new String(inBuf, 0, len);
outStream.write(Base64.getMimeDecoder().decode(out.getBytes()));
}
}
例如,对于我的示例输入文件,如果LARGE_BUF是1024,输出文件太小了4个字节,如果2*1024,我会得到上面提到的异常,如果7*1024,它会正常工作。感谢你的任何想法。非常感谢。
首先,将字节转换为字符串,然后立即转换回字节。因此,完全取消使用字符串。
其次,base64编码将每个三个字节的序列转换为四个字节,因此在解码时,需要四个字节才能正确解码三个原始数据字节。为每个任意读取的字节序列创建一个新的解码器是不安全的,字节序列的长度可能是也可能不是四的整数倍。
最后,Base64.Decoder有一个wrap(InputStream(方法,它使这变得相当容易:
try (InputStream inputStream = Base64.getDecoder().wrap(
new BufferedInputStream(
Files.newInputStream(Paths.get(inFile))))) {
Files.copy(inputStream, Paths.get(outFile));
}