本文簡要介紹ruby語言中 IO.readpartial
的用法。
用法
readpartial(maxlen) → string
readpartial(maxlen, out_string) → out_string
從流中讀取最多 maxlen
個字節;返回一個字符串(新字符串或給定的 out_string
)。它的編碼是:
-
out_string
的未更改編碼,如果給出了out_string
。 -
ASCII-8BIT,否則。
-
包含流中的
maxlen
字節(如果可用)。 -
否則包含所有可用字節,如果有的話。
-
否則為空字符串。
給定單個非負整數參數maxlen
,返回一個新字符串:
f = File.new('t.txt')
f.readpartial(30) # => "This is line one.\nThis is the"
f.readpartial(30) # => " second line.\nThis is the thi"
f.readpartial(30) # => "rd line.\n"
f.eof # => true
f.readpartial(30) # Raises EOFError.
給定參數 maxlen
和字符串參數 out_string
後,返回修改後的 out_string
:
f = File.new('t.txt')
s = 'foo'
f.readpartial(30, s) # => "This is line one.\nThis is the"
s = 'bar'
f.readpartial(0, s) # => ""
此方法對於諸如管道、套接字或 tty 之類的流很有用。它僅在沒有數據立即可用時才阻塞。這意味著它僅在以下 all
為真時阻塞:
-
流中的字節緩衝區為空。
-
流的內容是空的。
-
流不在 EOF。
當被阻塞時,該方法等待流上的更多數據或 EOF:
-
如果讀取更多數據,則該方法返回數據。
-
如果達到 EOF,則該方法引發
EOFError
。
當未被阻塞時,該方法立即響應:
-
如果有,則從緩衝區返回數據。
-
否則從流中返回數據(如果有)。
-
否則,如果流已達到 EOF,則引發
EOFError
。
請注意,此方法類似於 sysread。區別在於:
-
如果字節緩衝區不為空,則從字節緩衝區讀取,而不是“sysread for buffered
IO
(IOError
)”。 -
它不會導致 Errno::EWOULDBLOCK 和 Errno::EINTR。當 readpartial 通過 read 係統調用遇到 EWOULDBLOCK 和 EINTR 時,readpartial 會重試係統調用。
後者意味著 readpartial 對非阻塞標誌不敏感。它阻塞情況 IO#sysread
導致 Errno::EWOULDBLOCK 就好像 fd 處於阻塞模式一樣。
例子:
# # Returned Buffer Content Pipe Content
r, w = IO.pipe #
w << 'abc' # "" "abc".
r.readpartial(4096) # => "abc" "" ""
r.readpartial(4096) # (Blocks because buffer and pipe are empty.)
# # Returned Buffer Content Pipe Content
r, w = IO.pipe #
w << 'abc' # "" "abc"
w.close # "" "abc" EOF
r.readpartial(4096) # => "abc" "" EOF
r.readpartial(4096) # raises EOFError
# # Returned Buffer Content Pipe Content
r, w = IO.pipe #
w << "abc\ndef\n" # "" "abc\ndef\n"
r.gets # => "abc\n" "def\n" ""
w << "ghi\n" # "def\n" "ghi\n"
r.readpartial(4096) # => "def\n" "" "ghi\n"
r.readpartial(4096) # => "ghi\n" "" ""
相關用法
- Ruby IO.read用法及代碼示例
- Ruby IO.readlines用法及代碼示例
- Ruby IO.readchar用法及代碼示例
- Ruby IO.read_nonblock用法及代碼示例
- Ruby IO.rewind用法及代碼示例
- Ruby IO.reopen用法及代碼示例
- Ruby IO.raw用法及代碼示例
- Ruby IO.eof用法及代碼示例
- Ruby IO.fileno用法及代碼示例
- Ruby IO.pread用法及代碼示例
- Ruby IO.to_i用法及代碼示例
- Ruby IO.self << object用法及代碼示例
- Ruby IO.tty?用法及代碼示例
- Ruby IO.close_write用法及代碼示例
- Ruby IO.write_nonblock用法及代碼示例
- Ruby IO.set_encoding_by_bom用法及代碼示例
- Ruby IO.syswrite用法及代碼示例
- Ruby IO.close_read用法及代碼示例
- Ruby IO.stat用法及代碼示例
- Ruby IO.pwrite用法及代碼示例
- Ruby IO.ungetc用法及代碼示例
- Ruby IO.noecho用法及代碼示例
- Ruby IO.new用法及代碼示例
- Ruby IO.sysopen用法及代碼示例
- Ruby IO.try_convert用法及代碼示例
注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 IO.readpartial。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。