首页 > 解决方案 > 将数据从 ReadableByteChannel 传输到文件

问题描述

目标:从一个来源解密数据并将解密后的数据写入文件。

try (FileInputStream fis = new FileInputStream(targetPath.toFile());
        ReadableByteChannel channel = newDecryptedByteChannel(path, associatedData))
{
    FileChannel fc = fis.getChannel();
    long position = 0;
    while (position < ???)
    {
        position += fc.transferFrom(channel, position, CHUNK_SIZE);
    }
}

newDecryptedByteChannel(Path,byte[])不应该感兴趣的实现,它只是返回一个 ReadableByteChannel。

问题:结束while循环的条件是什么?何时到达“字节通道结束”?这里是transferFrom正确的选择吗?

这个问题可能是相关的(答案是将计数设置为Long.MAX_VALUE)。不幸的是,这对我没有帮助,因为文档说最多可以传输 count 个字节,具体取决于通道的性质和状态。

另一个想法是只检查实际传输的字节数是否为 0(从 返回transferFrom),但如果源通道是非阻塞的并且其输入缓冲区中立即可用的字节数少于 count,则此条件可能为真。

标签: javanio

解决方案


FileChannel. transferFrom()这是它从未告诉您有关流结束的奇怪功能之一。您必须独立知道输入长度。

我会为此使用流:特别是CipherInputStreamaBufferedInputStream围绕 aFileInputStream和 a FileOutputStream

但是您发布的代码无论如何都没有任何意义。它行不通。您正在传输到输入文件,并通过从 a 派生的通道FileInputStream,因此它是只读的,因此transferFrom()会引发异常。


推荐阅读