【问题标题】:BufferOutputStream only writes to larger pieces of data and not when < 40kbBufferOutputStream 仅写入较大的数据,而不是在 < 40kb 时
【发布时间】:2020-11-24 04:44:24
【问题描述】:

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

如果 cypherBufStream(读取输入文件的 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();
}

【问题讨论】:

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

标签: java encryption bytearrayoutputstream bufferedoutputstream


【解决方案1】:

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

但这意味着只有在以下情况下才会将数据写入输出(在这种情况下)文件:

  • 当流的缓冲区填满时,
  • 当您在直播中调用 flush() 时,或
  • 当您在直播中调用 close() 时。

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

但是,查看您的代码,您似乎正在(大约)128 字节的块中写入BufferedOutputStream。所以我的猜测是,即使在大文件的情况下,你也不会用这段代码写出整个文件。

【讨论】:

    猜你喜欢
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    相关资源
    最近更新 更多