當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。