Ruby的File.open和对f.close的需求

时间:2011-01-25 15:38:28

标签: ruby file

在大多数编程语言中,使用文件的流程是开放使用关闭的常识。然而,我在ruby代码中多次看到无法比拟的File.open调用,而且我在ruby文档中找到了this gem of knowledge

  

当垃圾收集器声明I / O流时,它们会自动关闭。

darkredandyellow 友好的irc承担这个问题:
[17:12]是的,而且,文件描述符的数量通常受操作系统的限制 [17:29]我假设你可以在垃圾收集器清理之前轻松耗尽可用的文件描述符。在这种情况下,您可能希望自己使用它们。 “垃圾收集者声称。”意味着GC将来会在某个时刻发挥作用。而且价格昂贵。显式关闭文件的原因很多。

  1. 我们是否需要明确关闭
  2. 如果是,那么为什么GC会自动关闭?
  3. 如果不是那么为什么选择?

5 个答案:

答案 0 :(得分:119)

  

我在ruby代码中多次看到无法匹配的File.open来电

你能举个例子吗?我只看到在新手编写的代码中,缺乏“大多数编程语言中的常识,使用文件的流程是开放使用 - 关闭”。

经验丰富的Rubyist要么显式关闭文件,要么更惯用,使用File.open的块形式,它会自动为您关闭文件。它的实现基本上看起来像这样:

def File.open(*args, &block)
  return open_with_block(*args, &block) if block_given?
  open_without_block(*args)
end

def File.open_without_block(*args)
  # do whatever ...
end

def File.open_with_block(*args)
  yield f = open_without_block(*args)
ensure
  f.close
end

脚本是一种特殊情况。脚本通常运行得如此之短,并且使用如此少的文件描述符使得关闭它们根本没有意义,因为操作系统无论如何都会在脚本退出时关闭它们。

  

我们需要明确关闭吗?

  

如果是,那么为什么GC会自动关闭?

因为在它收集了对象之后,你再也无法关闭文件,因此你会泄漏文件描述符。

请注意,关闭文件的不是垃圾收集器。垃圾收集器在收集对象之前只执行对象的任何终结器。恰好,File类定义了一个关闭文件的终结器。

  

如果没有那么为什么选择?

因为浪费的内存很便宜,但浪费的文件描述符却不便宜。因此,将文件描述符的生命周期与某些内存块的生命周期联系起来是没有意义的。

您无法预测何时垃圾收集器将运行。您甚至无法预测如果它将运行:如果您永远不会耗尽内存,垃圾收集器将永远不会运行,因此终结器永远不会运行,因此文件将永远不会被关闭。

答案 1 :(得分:67)

使用后应始终关闭文件描述符,也会刷新文件描述符。通常人们使用File.open或等效方法来处理文件描述符生存期。例如:

File.open('foo', 'w') do |f|
    f.write "bar"
end

在该示例中,文件会自动关闭。

答案 2 :(得分:1)

  1. 如果您没有,或者有其他失败
  2. 见2.

答案 3 :(得分:1)

根据http://ruby-doc.org/core-2.1.4/File.html#method-c-open

  

没有关联的块,File.open是:: new的同义词。如果   给出了可选的代码块,它将作为参数传递打开的文件   当块时,File对象将自动关闭   终止。该块的值将从File.open返回。

因此,当块终止时,将自动关闭:D

答案 4 :(得分:-3)

我们可以使用File.read()函数来读取ruby中的文件..... 比如,

file_variable = File.read("index.html")
在此示例中,

file_variable可以拥有该文件的完整值....