6.11. Swobodne nawigowanie po „jednokrotnie odczytywalnych” strumieniach wejściowych
Problem
Mamy obiekt wejścia-wyjścia — prawdopodobnie Socket
— nieobsługujący metod dostępu swobodnego (seek
, pos=
, rewind
itp.). Chcemy potraktować go jak plik dyskowy, po którego zawartości można się swobodnie przemieszczać.
Rozwiązanie
Najprostszym rozwiązaniem jest wczytanie strumienia (lub jego interesującego fragmentu) do pamięci jako obiektu StringIO
. Obiekt taki zachowuje się dokładnie tak jak plik.
require 'socket' require 'stringio' sock = TCPSocket.open("www.example.com", 80) sock.write("GET /\n") file = StringIO.new(sock.read) file.read(10) # => "<HTML>\r\n<H" file.rewind file.read(10) # => "<HTML>\r\n<H" file.pos = 90 file.read(15) # => ...
Get Ruby. Receptury now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.