gpt4 book ai didi

java - Base64编码到解码文件转换问题

转载 作者:行者123 更新时间:2023-12-01 19:28:35 29 4
gpt4 key购买 nike

我正在处理非常大的文件(> 2Gig)。每个输入文件都是 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,它会正常工作。感谢任何想法。谢谢。

最佳答案

首先,您将字节转换为字符串,然后立即转换回字节。因此,完全删除 String 的使用。

其次,base64编码将每个三个字节的序列变成四个字节,因此在解码时,需要四个字节才能正确解码原始数据的三个字节。为每个任意读取的字节序列创建一个新的解码器是不安全的,该解码器的长度可能是也可能不是四的倍数。

最后,Base64.Decoder 有一个 wrap(InputStream) method这使得这变得更加容易:

try (InputStream inputStream = Base64.getDecoder().wrap(
new BufferedInputStream(
Files.newInputStream(Paths.get(inFile))))) {

Files.copy(inputStream, Paths.get(outFile));
}

关于java - Base64编码到解码文件转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60569930/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com