在Ruby中读取文件的常见方法有哪些?

例如,这里有一个方法:

fileObj = File.new($fileName, "r")
while (line = fileObj.gets)
  puts(line)
end
fileObj.close

我知道Ruby非常灵活。每种方法的优点/缺点是什么?


当前回答

File.open("my/file/path", "r") do |f|
  f.each_line do |line|
    puts line
  end
end
# File is closed automatically at end of block

也可以像上面那样显式地关闭文件(传递一个块来打开并为你关闭它):

f = File.open("my/file/path", "r")
f.each_line do |line|
  puts line
end
f.close

其他回答

如果文件不是太长,最简单的方法是:

puts File.read(file_name)

事实上,IO。读取或文件。读取后自动关闭文件,因此不需要使用file。用木块打开。

返回your_file.log或.txt中的最后n行

path = File.join(Rails.root, 'your_folder','your_file.log')

last_100_lines = `tail -n 100 #{path}`

一种更有效的方法是流,它要求操作系统内核打开一个文件,然后一点一点地从中读取字节。在Ruby中逐行读取文件时,每次从文件中获取512字节的数据,然后按“行”分割。

通过缓冲文件的内容,在将文件划分为逻辑块的同时减少了I/O调用的数量。

例子:

将这个类作为服务对象添加到应用程序中:

class MyIO
  def initialize(filename)
    fd = IO.sysopen(filename)
    @io = IO.new(fd)
    @buffer = ""
  end

  def each(&block)
    @buffer << @io.sysread(512) until @buffer.include?($/)

    line, @buffer = @buffer.split($/, 2)

    block.call(line)
    each(&block)
  rescue EOFError
    @io.close
 end
end

调用它并向:each方法传递一个块:

filename = './somewhere/large-file-4gb.txt'
MyIO.new(filename).each{|x| puts x }

在这篇详细的文章中阅读:

Ruby Magic slping &流媒体文件由AppSignal

如果文件很小(吸声):

puts File.read("filename.txt")

如果文件很大(流媒体):

File.foreach("filename.txt") { |line| puts line }

我通常这样做:

open(path_in_string, &:read)

这将为您提供整个文本作为字符串对象。它只能在Ruby 1.9下工作。