2

我有这个代码:

a = File.open("/dev/urandom")
b = a.read(1024)
a.close

puts b

我希望从 /dev/urandom device\file 中获取前 1024 个字节,但我得到了一个错误,它说 read 只接受 slice 而不是 Integer。

所以我试着这样做:

b = a.read(("a" * 1000).to_slice)

但后来我在输出中得到了“1000”。

从 Crystal 文件中读取 x 字节的正确方法是什么?

4

1 回答 1

8

你所做的不是很理想,但它确实有效。IO#read(Slice(UInt8))返回实际读取的字节数,以防文件小于您请求的文件或由于其他原因数据不可用。换句话说,它是部分阅读。所以你进入1000b因为你传递的切片被填充了 1000 个字节。有IO#read_fully(Slice(UInt8))哪些阻塞,直到它尽可能多地满足请求,但无论如何也不能保证它。

更好的方法如下所示:

File.open("/dev/urandom") do |io|
  buffer = Bytes.new(1000) # Bytes is an alias for Slice(UInt8)
  bytes_read = io.read(buffer)
  # We truncate the slice to what we actually got back,
  # /dev/urandom never blocks, so this isn't needed in this specific
  # case, but good practice in general
  buffer = buffer[0, bytes_read] 
  pp buffer
end

IO还提供了各种便利功能,用于以各种编码读取字符串直到特定标记或达到限制。许多类型还实现了该from_io接口,使您可以轻松读取结构化数据。

于 2016-07-24T12:51:21.107 回答