You want to read some or all of a file into memory.
Open the file with Kernel#open
, and pass in a code block that
does the actual reading. To read the entire file into a single string,
use IO#read:
#Put some stuff into a file. open('sample_file', 'w') do |f| f.write("This is line one.\nThis is line two.") end # Then read it back out. open('sample_file') { |f| f.read } # => "This is line one.\nThis is line two."
To read the file as an array of lines, use IO#readlines:
open('sample_file') { |f| f.readlines } # => ["This is line one.\n", "This is line two."]
To iterate over each line in the file, use IO#each
. This technique loads only one line
into memory at a time:
open('sample_file').each { |x| p x } # "This is line one.\n" # "This is line two."
How much of the file do you want to read into memory at once? Reading the entire file in one gulp uses memory equal to the size of the file, but you end up with a string, and you can use any of Ruby's string processing techniques on it.
The alternative is to process the file one chunk at a time. This uses only the memory needed to store one chunk, but it can be more difficult to work with, because any given chunk may be incomplete. To process a chunk, you may end up reading the next chunk, and the next. This code reads the first 50-byte chunk from a file, but it turns out not to be enough:
puts open('conclusion') { |f| f.read(50) } # "I know who killed Mr. Lambert," said Joe. "It ...
No credit card required