2014-03-02 65 views
3

我試圖找到一個更優雅和scalaish的方式來逐行讀取文件,並在達到文件結尾時調用函數 。這是我目前的執行:Scalish的方式來讀取文件,並在文件結束時做些什麼

val source = scala.io.Source.fromFile("data.txt")  
for(line <- source.getLines()) 
{ 
    // do something with data 
    println(line) 
} 

// end of file reached do something else 
doSomethingWithAllDataLoaded() 

在這裏,我需要的更少迭代的東西,運行此文件同時讀,最後調用回調函數到達文件的每一端。

回答

0

您可以讀取該文件更多的Scala的風格是這樣的:

val source = scala.io.Source.fromFile("data.txt") 
source.getLines.foreach(println(_)) 

要處理線一併考慮parallel collections。這應該是這樣的:

source.getLines.toList.par.foreach(println(_)) 

但請記住,這樣你首先從文件中讀取所有行,然後開始並行處理它們。

希望這有助於

編輯

如果你想避免加載內存中的文件 - 只需使用Source.fromFile(...).getLines。它返回一個已經懶惰的Iterator[String]。更重要的是,您不應使用或使用.toList或類似方法來避免內存問題。像這樣的方法可以消除Iterator的所有懶惰,並強制嚴格(非懶惰,渴望)集合。

+0

實際上,我想要做的是並行讀取多個文件,並避免將它們加載到內存中,因爲它們很大。 – jrabary

+0

請閱讀我的編輯 – serejja

+1

並行磁盤IO?通常是一個壞主意。磁盤訪問是連續的,同時讀取多個文件將意味着來回移動磁頭,從而減慢一切...更好地順序讀取塊數據並行化塊處理。當然,你也可以考慮一個(昂貴的)花式並行IO文件系統...... – paradigmatic

相關問題