Class: Bio::FlatFile::BufferedInputStream
- Defined in:
- lib/bio/io/flatfile.rb
Overview
Wrapper for a IO (or IO-like) object. It can input with a buffer.
Instance Attribute Summary collapse
-
#path ⇒ Object
readonly
Pathname, filename or URI to open the object.
Class Method Summary collapse
-
.for_io(io) ⇒ Object
Creates a new input stream wrapper from the given IO object.
-
.open_file(filename, *arg) ⇒ Object
Creates a new input stream wrapper to open file filename by using File.open.
-
.open_uri(uri, *arg) ⇒ Object
Creates a new input stream wrapper from URI specified as uri.
Instance Method Summary collapse
-
#close ⇒ Object
Closes the IO object if possible.
-
#eof? ⇒ Boolean
Returns true if end-of-file.
-
#getc ⇒ Object
Same as IO#getc.
-
#gets(io_rs = $/) ⇒ Object
Same as IO#gets.
-
#initialize(io, path) ⇒ BufferedInputStream
constructor
Creates a new input stream wrapper.
-
#pos ⇒ Object
Returns current file position.
-
#pos=(p) ⇒ Object
Sets current file position if possible Internal buffer in this wrapper is cleared.
-
#prefetch_buffer ⇒ Object
Gets current prefetch buffer.
-
#prefetch_gets(*arg) ⇒ Object
It does @io.gets, and addes returned string to the internal buffer, and returns the string.
-
#prefetch_readpartial(*arg) ⇒ Object
It does @io.readpartial, and addes returned string to the internal buffer, and returns the string.
-
#rewind ⇒ Object
Rewinds the IO object if possible Internal buffer in this wrapper is cleared.
-
#skip_spaces ⇒ Object
Skips space characters in the stream.
-
#to_io ⇒ Object
Converts to IO object if possible.
-
#ungetc(c) ⇒ Object
Pushes back one character into the internal buffer.
-
#ungets(str) ⇒ Object
Pushes back given str to the internal buffer.
Constructor Details
#initialize(io, path) ⇒ BufferedInputStream
Creates a new input stream wrapper
32 33 34 35 36 37 |
# File 'lib/bio/io/flatfile.rb', line 32 def initialize(io, path) @io = io @path = path # initialize prefetch buffer @buffer = '' end |
Instance Attribute Details
#path ⇒ Object (readonly)
Pathname, filename or URI to open the object. Like File#path, returned value isn’t normalized.
95 96 97 |
# File 'lib/bio/io/flatfile.rb', line 95 def path @path end |
Class Method Details
.for_io(io) ⇒ Object
Creates a new input stream wrapper from the given IO object.
40 41 42 43 44 45 46 47 |
# File 'lib/bio/io/flatfile.rb', line 40 def self.for_io(io) begin path = io.path rescue NameError path = nil end self.new(io, path) end |
.open_file(filename, *arg) ⇒ Object
Creates a new input stream wrapper to open file filename by using File.open. *arg is passed to File.open.
Like File.open, a block can be accepted.
54 55 56 57 58 59 60 61 62 63 |
# File 'lib/bio/io/flatfile.rb', line 54 def self.open_file(filename, *arg) if block_given? then File.open(filename, *arg) do |fobj| yield self.new(fobj, filename) end else fobj = File.open(filename, *arg) self.new(fobj, filename) end end |
.open_uri(uri, *arg) ⇒ Object
Creates a new input stream wrapper from URI specified as uri. by using OpenURI.open_uri or URI#open. uri must be a String or URI object. *arg is passed to OpenURI.open_uri or URI#open.
Like OpenURI.open_uri, it can accept a block.
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
# File 'lib/bio/io/flatfile.rb', line 71 def self.open_uri(uri, *arg) if uri.kind_of?(URI) if block_given? uri.open(*arg) do |fobj| yield self.new(fobj, uri.to_s) end else fobj = uri.open(*arg) self.new(fobj, uri.to_s) end else if block_given? OpenURI.open_uri(uri, *arg) do |fobj| yield self.new(fobj, uri) end else fobj = OpenURI.open_uri(uri, *arg) self.new(fobj, uri) end end end |
Instance Method Details
#close ⇒ Object
Closes the IO object if possible
103 104 105 |
# File 'lib/bio/io/flatfile.rb', line 103 def close @io.close end |
#eof? ⇒ Boolean
Returns true if end-of-file. Otherwise, returns false.
Note that it returns false if internal buffer is this wrapper is not empty,
132 133 134 135 136 137 138 |
# File 'lib/bio/io/flatfile.rb', line 132 def eof? if @buffer.size > 0 false else @io.eof? end end |
#getc ⇒ Object
Same as IO#getc.
189 190 191 192 193 194 195 196 197 |
# File 'lib/bio/io/flatfile.rb', line 189 def getc if @buffer.size > 0 then r = @buffer[0] @buffer = @buffer[1..-1] else r = @io.getc end r end |
#gets(io_rs = $/) ⇒ Object
Same as IO#gets.
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
# File 'lib/bio/io/flatfile.rb', line 141 def gets(io_rs = $/) if @buffer.size > 0 if io_rs == nil then r = @buffer + @io.gets(nil).to_s @buffer = '' else if io_rs == '' then sp_rs = /\n\n/n sp_rs_orig = "\n\n" else sp_rs = Regexp.new(Regexp.escape(io_rs, 'n'), 0, 'n') sp_rs_orig = io_rs end a = @buffer.split(sp_rs, 2) if a.size > 1 then r = a[0] + sp_rs_orig @buffer = a[1] else @buffer << @io.gets(io_rs).to_s a = @buffer.split(sp_rs, 2) if a.size > 1 then r = a[0] + sp_rs_orig @buffer = a[1].to_s else r = @buffer @buffer = '' end end end r else @io.gets(io_rs) end end |
#pos ⇒ Object
Returns current file position
116 117 118 |
# File 'lib/bio/io/flatfile.rb', line 116 def pos @io.pos - @buffer.size end |
#pos=(p) ⇒ Object
Sets current file position if possible Internal buffer in this wrapper is cleared.
122 123 124 125 126 |
# File 'lib/bio/io/flatfile.rb', line 122 def pos=(p) r = (@io.pos = p) @buffer = '' r end |
#prefetch_buffer ⇒ Object
Gets current prefetch buffer
207 208 209 |
# File 'lib/bio/io/flatfile.rb', line 207 def prefetch_buffer @buffer end |
#prefetch_gets(*arg) ⇒ Object
It does @io.gets, and addes returned string to the internal buffer, and returns the string.
213 214 215 216 217 |
# File 'lib/bio/io/flatfile.rb', line 213 def prefetch_gets(*arg) r = @io.gets(*arg) @buffer << r if r r end |
#prefetch_readpartial(*arg) ⇒ Object
It does @io.readpartial, and addes returned string to the internal buffer, and returns the string.
221 222 223 224 225 |
# File 'lib/bio/io/flatfile.rb', line 221 def prefetch_readpartial(*arg) r = @io.readpartial(*arg) @buffer << r if r r end |
#rewind ⇒ Object
Rewinds the IO object if possible Internal buffer in this wrapper is cleared.
109 110 111 112 113 |
# File 'lib/bio/io/flatfile.rb', line 109 def rewind r = @io.rewind @buffer = '' r end |
#skip_spaces ⇒ Object
Skips space characters in the stream. returns nil.
229 230 231 232 233 234 235 236 237 238 |
# File 'lib/bio/io/flatfile.rb', line 229 def skip_spaces ws = { ?\s => true, ?\n => true, ?\r => true, ?\t => true } while r = self.getc unless ws[r] then self.ungetc(r) break end end nil end |
#to_io ⇒ Object
Converts to IO object if possible
98 99 100 |
# File 'lib/bio/io/flatfile.rb', line 98 def to_io @io.to_io end |
#ungetc(c) ⇒ Object
Pushes back one character into the internal buffer. Unlike IO#getc, it can be called more than one time.
201 202 203 204 |
# File 'lib/bio/io/flatfile.rb', line 201 def ungetc(c) @buffer = sprintf("%c", c) + @buffer nil end |
#ungets(str) ⇒ Object
Pushes back given str to the internal buffer. Returns nil. str must be read previously with the wrapper object.
Note that in current implementation, the str can be everything, but please don’t depend on it.
183 184 185 186 |
# File 'lib/bio/io/flatfile.rb', line 183 def ungets(str) @buffer = str + @buffer nil end |