2012-01-14 19 views

答えて

7

FWIWは、ここ(標準ライブラリ/ wのこだわりの)私はどうなるのかです:注意すべき

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

物事:それは常に1を返しますので、

  1. 機能は、Option[String]代わりのList[String]を返します。またはなし。これはもっと慣用的なScalaです。
  2. srcもファイルを開くことができることを非常にオフのチャンスで、適切に閉じられているが、読書は
  3. 例外をスローIteratorの最初の項目を取得するために.find(_ => true)を使用すると、私は偉大な感じさせるが、ありますありませんnextOptionメソッドであり、これは中間のListに変換するよりも優れています。
  4. IOExceptionファイルのオープンまたは読み込みが行われます。

私はまた、あなたのリソースを管理し、自動的にあなたがする必要がある場合は、ファイルを閉じるためのより良いAPIを与えることscala-armライブラリを使用することをお勧めします。

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

+0

それを捕まえていなかった、ありがとう! – dave

8

ファイルを閉じるようにしたい、とあなたが取得したい場合ファイルが実際に空である場合

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

、その後、エラーを投げるのではなく空のコレクションを使用すると、標準ライブラリに自分自身を制限する場合は、あなたがそれを行うことができ、最短の方法についてです。

関連する問題