本文简要介绍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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。