当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby IO.readpartial用法及代码示例


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