2015-10-15 48 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