9

What's the best way to read from a type implementing the std::io::Read trait when the contents of the output isn't important?

Possible options I see are:

  • Read single bytes in a loop.
  • Allocate a potentially huge vector and read into that.
  • Something in-between... read into a fixed sized buffer in a loop.

The first 2 options don't seem ideal, the third is OK but inconvenient.

Does Rust provide a convenient way to achieve this?

Shepmaster
  • 388,571
  • 95
  • 1,107
  • 1,366
ideasman42
  • 42,413
  • 44
  • 197
  • 320

1 Answers1

12

You can use io::copy(), Read::take() and io::sink() to discard a specific number of bytes:

let mut file = File::open("foo.txt").unwrap();

// Discard 27 bytes
io::copy(&mut file.by_ref().take(27), &mut io::sink());

// Read the rest
let mut interesting_contents = Vec::new();
file.read_to_end(&mut interesting_contents).unwrap();

(Playground)

Here, we also have to use by_ref() in order to be able to still use the file afterwards.

Lukas Kalbertodt
  • 79,749
  • 26
  • 255
  • 305
  • This doesn't work for me (`dyn Read`). After `io::copy(..)`, the result from `read(..)` is still in same as reading before `io::copy(..)`. Why? – BingLi224 Apr 14 '20 at 13:36