2012-01-20 62 views

回答

18

它設置文件的同步模式。

這會影響將來的操作並導致輸出寫入塊緩衝。

如果f.tty?爲真,即如果文件連接到類似控制檯的設備,則輸出不會被塊緩衝。但是當輸出到管道或文件時,f.tty?將爲false,並且I/O庫將切換到塊緩衝,即即將輸出累積到緩衝區中並僅在文件關閉時寫入,程序退出,或緩衝區填滿。這更快,最終結果是一樣的。

設置f.sync = true擊敗此開關。如果管道的輸出連接到某個實際上是控制檯或某種方式的交互式或文件內容正在被主動監視的地方,這可能很有用。

+1

+1,儘可能地保持緩衝很重要。沒有什麼比如發現緩衝是多麼有用的困難方法。 –

+1

最有用的答案。謝謝。 –

4

基本上,它將任何緩衝在內存中的數據寫出到磁盤上。

+0

聲音正確。我想知道爲什麼它不在文檔中。 http://www.ruby-doc.org/stdlib-1.9.3/libdoc/tempfile/rdoc/Tempfile.html –

+1

「我想知道爲什麼它不在文檔中。」?因爲它是IO的一部分?嘗試'ri IO.sync'。 –

+3

這個答案有點令人誤解。立即寫入數據的操作是'fh.fsync'。 '#sync'方法設置同步模式並影響將來的操作。現在,如果你的意思是「導致*未來*操作立即寫入數據」,那麼,當然。 – DigitalRoss

2

臨時文件從IO繼承。來自IO.sync文檔:

ios.sync -> true or false 

------------------------------------------------------------------------------ 

Returns the current ``sync mode'' of ios. When sync mode is true, all 
output is immediately flushed to the underlying operating system and is not 
buffered by Ruby internally. See also IO#fsync. 

    f = File.new("testfile") 
    f.sync #=> false 
相關問題