instance method IO#pread

pread(maxlen, offset, outbuf = "") -> string[permalink][rdoc][edit]

preadシステムコールを使ってファイルポインタを変更せずに、また現在のファイルポインタに依存せずにmaxlenバイト読み込みます。

IO#seekIO#readの組み合わせと比べて、アトミックな操作になるという点が優れていて、複数スレッド/プロセスから同じIOオブジェクトを様々な位置から読み込むことを許します。どのユーザー空間のIO層のバッファリングもバイパスします。

[PARAM] maxlen:
読み込むバイト数を指定します。
[PARAM] offset:
読み込み開始位置のファイルの先頭からのオフセットを指定します。
[PARAM] outbuf:
データを受け取る String を指定します。
[EXCEPTION] Errno::EXXX:
シークまたは書き込みが失敗した場合に発生します。
[EXCEPTION] EOFError:
EOF に到達した時に発生します。
[EXCEPTION] NotImplementedError:
システムコールがサポートされていない OS で発生します。


File.write("testfile", "This is line one\nThis is line two\n")
File.open("testfile") do |f|
  p f.read           # => "This is line one\nThis is line two\n"
  p f.pread(12, 0)   # => "This is line"
  p f.pread(9, 8)    # => "line one\n"
end