bufferoutputstream只写入较大的数据块,而不是< 40kb时

oug3syen  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(415)

我的目标是把一个完整的文件解密成另一个文件。
如果cypherBuffStream(读取输入文件的bufferedinputstream)太小(约128字节),则出于某种原因,此输出循环不会写入addmsgout。当引入38kb及以上的大文件时,它可以正常工作。我不停地把头撞在墙上想弄明白,希望能得到一些帮助。

// Decrypt M and H using RSA encryption
OutputStream addmsgOut = new BufferedOutputStream(new FileOutputStream("message.add-msg")); 
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] piece = new byte[128];
int e;
ByteArrayOutputStream out4 = new ByteArrayOutputStream();
while ((e = cypherBufStream.read(piece)) != -1) {
    out4.write(piece, 0, e);
    addmsgOut.write(cipher.doFinal(out4.toByteArray()));
    out4.reset();
}
hc2pp10m

hc2pp10m1#

BufferedOutputStream 照名字说的做。它缓冲了数据。。。避免在小的写请求上浪费cpu周期、系统调用等。
但这意味着只有在以下情况下,数据才会写入输出(在本例中)文件:
当流的缓冲区填满时,
当你打电话的时候 flush() 在溪流上,或者
当你打电话的时候 close() 在溪流上。
另一件要注意的是你执行了一个 write(byte[], ...) 大于流的缓冲区时,缓冲区中的任何内容都将被刷新,然后绕过缓冲区执行整个写操作(请注意,这是特定于实现的行为…)
但是,查看您的代码,您似乎正在向 BufferedOutputStream 在(大约)128字节的块中。所以我猜即使在大文件的情况下,你也不能用这个代码写出整个文件。

相关问题