File I/O in Ruby
Read and write files safely with block forms and explicit encodings.
Quick read/write
Convenience methods handle whole files.
content = File.read("notes.txt", mode: "r:utf-8")
File.write("out.txt", "hello\n", mode: "w:utf-8")
Open with a block
Blocks auto-close files even on exceptions.
File.open("log.txt", "a:utf-8") do |f|
f.puts("started at #{Time.now}")
end
Modes and encodings
Common modes: "r" read, "w" write (truncate), "a" append, plus "b" binary and ":encoding".
File.open("data.bin", "wb") { |f| f.write("\x00\x01") }
Line-by-line streaming
Stream files to avoid loading into memory.
File.foreach("big.csv", encoding: "UTF-8") do |line|
cols = line.strip.split(",")
# process cols
end
Tempfiles and atomic writes
Use Tempfile for safe scratch files; write atomically by writing to a temp file and renaming.
require 'tempfile'
Tempfile.create(['report', '.txt']) do |tmp|
tmp.puts("data")
tmp.flush
File.rename(tmp.path, "final.txt")
end
Paths and directories
Use File and Dir utilities; prefer File.join for cross‑platform paths.
File.exist?("path")
File.directory?("/tmp")
File.join("/tmp", "file.txt")
Dir.children(".")
Dir.glob("**/*.rb")
Permissions and metadata
File.chmod(0o644, "out.txt")
File.mtime("out.txt")
Summary
- Prefer block forms to ensure files are closed
- Specify mode/encoding explicitly; stream large files line-by-line
- Use
Tempfileand atomic rename for safe writes