Crystal lang Crystal从文件中读取x字节

Crystal lang Crystal从文件中读取x字节,crystal-lang,Crystal Lang,我有以下代码: a = File.open("/dev/urandom") b = a.read(1024) a.close puts b 我希望从/dev/uradom device\文件中获得前1024个字节,但是我得到了一个错误,它说read只接受slice而不接受Integer 所以我试着这样做: b=a.read(((“a”*1000).to_slice) 但后来我在输出中得到了“1000” 从Crystal中的文件读取x字节的正确方法是什么 你所做的不是很理想,但它确实起了作用I

我有以下代码:

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

puts b
我希望从/dev/uradom device\文件中获得前1024个字节,但是我得到了一个错误,它说read只接受slice而不接受Integer

所以我试着这样做:

b=a.read(((“a”*1000).to_slice)

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


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

你所做的不是很理想,但它确实起了作用
IO#read(Slice(UInt8))
返回实际读取的字节数,以防文件小于您请求的字节数或数据因其他原因不可用。换句话说,这是一个部分阅读。因此,您在
b
中获得
1000
,因为您传递的切片中填充了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
接口,允许您轻松读取结构化数据