2015-10-15 43 views
1

我使用的形式空檢查在斯卡拉while循環,不尋常的行爲

while((str = br.readLine()) != null){ 
    sb.append(str) 
} 

聚合使用BufferedReaderInputStream的內容,但這個迅速引起了OutOfMemoryError作爲空檢查失敗拿起空我StringBuffer規模不斷增加......

我已經驗證str確實有null的值,也驗證了它不是"null"

重構我的代碼

str = br.readLine() 
while(str != null){ 
    sb.append(str) 
    str = br.readLine() 
} 

的作品,但我不知道如何做到這一點是任何不同。有任何想法嗎?

+3

還有更多類似Scala的方式來讀取文件的內容,例如: 'val sb = new StringBuilder; Source.fromFile(myFile).addString(sb)' – Jesper

+0

@Jesper這裏的問題是,我正在使用Java庫:)我會記住你的建議。 –

回答

3

在scala中,表達式str = br.readline()的產出返回值類型Unit,它總是不等於null。它應該給你一個關於比較Unit爲空的警告。

你是正確的重構它。

P.S.正如@Jesper正確評論你的問題,這不是你通常在scala中讀取文件的方式。所以,如果你這樣做 - 請使用他的代碼示例。如果您有任何其他InputStream,您可以使用Source.fromInputStream

0

Archeg解釋它精美那麼試試這個:

var str = "" 
while({str = br.readLine; str != null}) { 

} 

因爲你在斯卡拉工作,請嘗試使用

scala.io.Source.fromInputStream(is).getLines().mkString("\n") 

val bufferedReader = new BufferedReader(inputStreamReader) 
Iterator continually bufferedReader.readLine takeWhile (_ != null) mkString