Java BufferOutputStream仅写入较大的数据块,而不在<;40kb

Java BufferOutputStream仅写入较大的数据块,而不在<;40kb,java,encryption,bytearrayoutputstream,bufferedoutputstream,Java,Encryption,Bytearrayoutputstream,Bufferedoutputstream,我的目标是将整个文件解密为另一个文件 如果CypherBuffStream(读取输入文件的BufferedInputStream)太小,即大约128字节,出于某种原因,此输出循环将不会写入addmsgOut。当引入38kb及以上的较大文件时,它可以正常工作。我不停地把头撞在墙上想弄明白,我希望能得到一些帮助 // Decrypt M and H using RSA encryption OutputStream addmsgOut = new BufferedOutputStream(new F

我的目标是将整个文件解密为另一个文件

如果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();
}

BufferedOutputStream
按照名称执行。它缓冲数据。。。避免在小的写请求上浪费CPU周期、系统调用等

但这意味着数据仅在以下情况下写入输出(在本例中)文件:

  • 当流的缓冲区填满时
  • 在流上调用
    flush()
    时,或
  • 在流上调用
    close()

另一件需要注意的事情是,您执行的
写入(字节[…])
大于流的缓冲区,缓冲区中的任何内容都会被刷新,然后整个写入都会绕过缓冲区执行。(请注意,这是特定于实现的行为…)


但是,查看您的代码,您似乎正在以(大约)128字节的块写入
BufferedOutputStream
。因此,我的猜测是,即使在大文件的情况下,您也没有写出整个文件,使用此代码。

您可能需要刷新或关闭输出流。