java - 将数据从 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,则此条件可能为真。
解决方案
FileChannel. transferFrom()
这是它从未告诉您有关流结束的奇怪功能之一。您必须独立知道输入长度。
我会为此使用流:特别是CipherInputStream
aBufferedInputStream
围绕 aFileInputStream
和 a FileOutputStream
。
但是您发布的代码无论如何都没有任何意义。它行不通。您正在传输到输入文件,并通过从 a 派生的通道FileInputStream
,因此它是只读的,因此transferFrom()
会引发异常。
推荐阅读
- java - 用户确认输入后如何运行方法?
- json - 使用 wso2 esb 无条件过滤 json 文件
- python - 如何为 Windows 10 (Python 3.7) 安装 pyserial
- python - python“英特尔 MKL 致命错误:无法加载 libmkl_rt.so”
- android - 如何在 android 中使用 Gson volley 获取所有 API 数据
- python - 嵌套字典到数据框
- python - 不再能够 pip 安装:无法获取 URL
- wpf - 可停靠工具栏
- php - 在 Laravel 中备份 MySQL 表,无需第三方库
- actions-on-google - Actions on Google - 配置模拟器以显示我的测试应用