2013-04-05 20 views
2

我已經創建了一個函數,我將其作爲輸入流的參數並返回一個由字符串組成的迭代器。我做到這一點,如下所示:在讀取行期間Source.fromInputStream異常處理

def lineEntry(fileInputStream:InputStream):Iterator[String] = { 
    Source.fromInputStream(fileInputStream).getLines() 
} 

我使用的方法如下:

val fStream = getSomeInputStreamFromSource() 
lineEntry(fStream).foreach{ 
    processTheLine(_) 
} 

現在是完全可能的,如果遇到人品不好,而它的遍歷方法lineEntry可能會炸燬inputstream使用foreach。

有什麼方法可以對付這種情況? (斯卡拉2.10)

回答

4

快速的解決方案:

def lineEntry(fileInputStream:InputStream):Iterator[String] = { 
    implicit val codec = Codec.UTF8 // or any other you like 
    codec.onMalformedInput(CodingErrorAction.IGNORE) 

    Source.fromInputStream(fileInputStream).getLines() 
} 

在斯卡拉2.9有一個小的差異:

implicit val codec = Codec(Codec.UTF8) 

Codec有也多了一些配置選項,使用它你可以調整它的行爲在這種情況。

+0

謝謝。看來onMalformedInput在我的編譯器版本中不存在scala.Source.IO.Codec.UTF8。這是一個2.10功能嗎?我使用的是2.9.2 – 2013-04-06 00:36:29

+0

我試着這樣做:隱式val codec = Codec.UTF8.newDecoder() codec.onMalformedInput(CodingErrorAction.IGNORE) – 2013-04-06 00:44:45

+0

@sc_ray這可能不起作用。請參閱我的編輯。 – ghik 2013-04-06 00:54:34