あなたがしたことはあまり理想的ではありませんが、実際にはうまくいきました。IO#read(Slice(UInt8))
ファイルが要求したものよりも小さい場合、または他の理由でデータが利用できない場合に備えて、実際に読み取られたバイト数を返します。つまり、部分読み取りです。渡したスライスが 1000 バイトでいっぱいだったので、入ります1000
。b
可能な限り多くの要求を満たすまでブロックするものがあり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
構造化データを簡単に読み取ることができます。