Base64编码到解码文件的转换问题



我正在处理非常大的文件(>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));
}

最新更新