Io 如何惯用/高效地从Read+;寻求写作?

Io 如何惯用/高效地从Read+;寻求写作?,io,pipe,rust,Io,Pipe,Rust,我想从输入文件中的随机位置获取数据,然后按顺序输出到输出文件。最好是没有不必要的分配 : 使用std::io::{self,SeekFrom,Cursor,Read,Write,Seek}; #[测试] fn读写(){ //假设这是一个输入文件 让mut input_file=Cursor::new(b“worldholl”); //这是输出文件 让mut output_file=Vec:::new(); 汇编(&mut输入\文件,&mut输出\文件).unwrap(); assert_eq!(

我想从输入文件中的随机位置获取数据,然后按顺序输出到输出文件。最好是没有不必要的分配

:

使用std::io::{self,SeekFrom,Cursor,Read,Write,Seek};
#[测试]
fn读写(){
//假设这是一个输入文件
让mut input_file=Cursor::new(b“worldholl”);
//这是输出文件
让mut output_file=Vec:::new();
汇编(&mut输入\文件,&mut输出\文件).unwrap();
assert_eq!(b“helloworld”&输出_文件[…]);
}
//我想从输入文件中的随机位置获取数据
//并按顺序将它们输出到输出文件
发布fn汇编(输入:&mut I,输出:&mut O)->结果
其中I:Read+Seek,O:Write
{
//首先查找并输出“hello”
try!(input.seek(参见kfrom::Start(5));
让mut hello_buf=[0u8;5];
试试!(输入。获取(5)。读取(&mut hello_buf));
试试!(output.write(&hello_buf));
//然后输出“世界”
try!(input.seek(参见kfrom::Start(0));
让mut world_buf=[0u8;5];
尝试!(输入。获取(5)。读取(&mut world_buf));
try!(output.write(&world_buf));
好(())
}
这里我们不必担心I/O延迟

问题:

  • stable Rust是否有助手从一个流中提取x字节并将其推送到另一个流中?还是我必须自己滚
  • 如果我必须自己滚,也许有更好的办法
  • 您正在寻找:

    使用std::io:{self,prelude::*,SeekFrom};
    pub fn assemble(mut输入:I,mut输出:O)->结果
    哪里
    I:读+找,
    O:写,
    {
    //首先查找并输出“hello”
    查找(参见从::开始(5))?;
    io::复制(&mut input.by_ref().take(5),&mut output)?;
    //然后输出“世界”
    查找(SeekFrom::Start(0))?;
    io::复制(&mut input.take(5),&mut output)?;
    好(())
    }
    
    如果您查看,您可以看到它与您的代码类似。但是,它会注意处理更多错误情况:

  • write
    确实不是总是写你要求它写的所有东西
  • “中断”写入通常不是致命的

  • 它还使用了更大的缓冲区大小,但仍然是堆栈分配的。

    无关:将assemble更改为使用
    ,它甚至更通用(允许trait对象)。
    use std::io::{self, prelude::*, SeekFrom};
    
    pub fn assemble<I, O>(mut input: I, mut output: O) -> Result<(), io::Error>
    where
        I: Read + Seek,
        O: Write,
    {
        // first seek and output "hello"
        input.seek(SeekFrom::Start(5))?;
        io::copy(&mut input.by_ref().take(5), &mut output)?;
    
        // then output "world"
        input.seek(SeekFrom::Start(0))?;
        io::copy(&mut input.take(5), &mut output)?;
    
        Ok(())
    }