Rust 如何使用tokio::io::BufReader进行分块阅读
我使用以下方法计算文件的校验和:Rust 如何使用tokio::io::BufReader进行分块阅读,rust,rust-tokio,Rust,Rust Tokio,我使用以下方法计算文件的校验和: pub fn sha256\u摘要(文件路径:&str)->结果{ 让file=fs::file::open(文件路径)?; 让mut reader=BufReader::new(文件); 让mut context=context::new(&SHA256); 环路{ 让consummed={ 让buffer=reader.fill_buf()?; 如果buffer.is_为空(){ 打破 } 上下文更新(缓冲区); buffer.len() }; 读者消费(消
pub fn sha256\u摘要(文件路径:&str)->结果{
让file=fs::file::open(文件路径)?;
让mut reader=BufReader::new(文件);
让mut context=context::new(&SHA256);
环路{
让consummed={
让buffer=reader.fill_buf()?;
如果buffer.is_为空(){
打破
}
上下文更新(缓冲区);
buffer.len()
};
读者消费(消费);
}
让digest=context.finish();
Ok(写入十六进制字节(摘要.as\u ref())
}
校验和:
dca3b9746da896f05072bdec6b788513029b26ab453b82e2e9d4365e56e2c913
Elapsed: 226.14ms
dca3b9746da896f05072bdec6b788513029b26ab453b82e2e9d4365e56e2c913
Elapsed: 448.25ms
我已经在东京试过了:
async fn sha256\u摘要(文件路径:&str)->结果{
让文件=文件::打开(文件路径)。等待?;
让mut stream=FramedRead::new(文件,BytesCodec::new());
让mut context=context::new(&SHA256);
而让一些(字节)=流。尝试_next()。等待{
context.update(&bytes);
}
让digest=context.finish();
Ok(写入十六进制字节(摘要.as\u ref())
}
但不幸的是,计算校验和需要两倍的时间,因此我想尝试使用
tokio::io::BufReader
的一个选项。我面临的问题是实现,以便使用该方法
校验和:
dca3b9746da896f05072bdec6b788513029b26ab453b82e2e9d4365e56e2c913
Elapsed: 226.14ms
dca3b9746da896f05072bdec6b788513029b26ab453b82e2e9d4365e56e2c913
Elapsed: 448.25ms
我正在努力:
async fn sha256\u digest\u BufReader(文件路径:&str)->结果{
让文件=文件::打开(文件路径)。等待?;
让mut reader=BufReader::new(文件);
让mut context=context::new(&SHA256);
环路{
让consummed={
让buffer=reader.buffer();
如果buffer.is_为空(){
打破
}
上下文更新(缓冲区);
buffer.len()
};
读者消费(消费);
}
让digest=context.finish();
Ok(写入十六进制字节(摘要.as\u ref())
}
但是得到这个错误:
error[E0599]: no method named `consume` found for struct `tokio::io::util::buf_reader::BufReader<tokio::fs::file::File>` in the current scope
--> src/main.rs:63:16
|
63 | reader.consume(consummed);
| ^^^^^^^ method not found in `tokio::io::util::buf_reader::BufReader<tokio::fs::file::File>`
warning: unused import: `tokio::io::AsyncBufRead`
error[E0599]:在当前作用域中找不到结构`tokio::io::util::buf_reader::BufReader`的名为`consume`的方法
-->src/main.rs:63:16
|
63 |读者消费(消费);
|在'tokio::io::util::buf_reader::BufReader::BufReader'中找不到方法`
警告:未使用的导入:`tokio::io::AsyncBufRead`
你知道如何实施吗
更新:我正在尝试:
async fn sha256\u digest\u BufReader(文件路径:&str)->结果{
让文件=文件::打开(文件路径)。等待?;
让mut reader=BufReader::new(文件);
让mut context=context::new(&SHA256);
让mut buf:[u8;8192]=[0;8192];//块大小(8K、65536等)
而让Ok(大小)=reader.read(&mut buf[…])等待{
如果大小==0{
打破
}
context.update(&buf[0..size]);
}
让digest=context.finish();
Ok(写入十六进制字节(摘要.as\u ref())
}
但是仍然运行“慢”或至少两倍的时间,甚至改变块大小,例如使用
65536
,131072
,tokio::io::BufReader
进行测试,已经实现了AsyncBufRead
,并且它通过AsyncRead
,您可以使用AsyncReadExt
读取字节,这里声明了fill_buf
的默认buf大小:它找不到consume
方法,因为consume
期望自己成为Pin
@ÖmerErden你能帮我更好地理解Pin
的方式和内容吗我正在努力理解这个想法,但仍然没有得到它,因为你是个傻瓜连续调用read_to_end
,read_to_end
将立即读取整个文件,然后每次调用后将读取0字节,您需要用read读取块,请检查:尝试使用buf[…字节]
获取实际块