2012-01-14 27 views

回答

7

FWIW,這裏是我會做什麼(粘瓦特/標準庫):

def firstLine(f: java.io.File): Option[String] = { 
    val src = io.Source.fromFile(f) 
    try { 
    src.getLines.find(_ => true) 
    } finally { 
    src.close() 
    } 
} 

注意事項:

  1. 該函數返回Option[String]代替List[String],因爲它總是返回一個或沒有。這是更通俗的斯卡拉。
  2. src正確關閉,即使是在非常起飛的機會,你可以打開該文件,但看完拋出一個異常
  3. 使用.find(_ => true)得到Iterator的第一個項目沒有讓我感覺非常好,但有沒有nextOption方法,這比轉換爲不使用的中間List要好。
  4. IOException打開或讀取文件傳遞。

我還推薦使用scala-arm庫爲您提供更好的API來管理資源並在需要時自動關閉文件。

import resource._ 

def firstLine(f: java.io.File): Option[String] = { 
    managed(io.Source.fromFile(f)) acquireAndGet { src => 
    src.getLines.find(_ => true) 
    } 
} 
10

如果你不關心使用後釋放文件資源,下面是一個非常convienient方式:

Source.fromFile("myfile.csv").getLines.next()

+1

從一個戴夫到另一個戴夫,此方法無法關閉文件描述符。經常這樣做,最終會打開太多文件。 – leedm777 2012-01-16 01:16:18

+0

沒有抓到,謝謝! – dave 2012-01-16 02:33:40

8

如果你想關閉的文件,你想要得到的空集,如果該文件實際上是空的,而不是拋出一個錯誤,然後

val myLine = { 
    val src = Source.fromFile("myfile.csv") 
    val line = src.getLines.take(1).toList 
    src.close 
    line 
} 

約,如果你限制自己的標準庫,你可以做到這一點的最短途徑。

相關問題