Scala中循环时空检入,异常行为

Scala中循环时空检入,异常行为,scala,while-loop,Scala,While Loop,我正在使用BufferedReader使用表单聚合InputStream的内容 while( (str = br.readLine()) != null){ sb.append(str) } 但这很快导致了一个OutOfMemoryError,因为空检查无法提取空值,并且我的StringBuffer的大小不断增加 我已经验证了str的值是否为null,并且还验证了它不是“null” 将代码重构为 str = br.readLine() while(str != null){ sb.ap

我正在使用
BufferedReader
使用表单聚合
InputStream
的内容

while( (str = br.readLine()) != null){
  sb.append(str)
}
但这很快导致了一个
OutOfMemoryError
,因为空检查无法提取空值,并且我的
StringBuffer
的大小不断增加

我已经验证了
str
的值是否为
null
,并且还验证了它不是
“null”

将代码重构为

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

工作,但我不知道这会有什么不同。有什么想法吗?

在scala中,表达式
str=br.readline()
产生类型为
Unit
的返回值,该值始终不等于null。它应该给您一个关于将
Unit
与null进行比较的警告

你这样重构它是正确的


另外,@Jesper正确地评论了您的问题,这不是您通常在scala中读取文件的方式。因此,如果您这样做,请使用他的代码示例。如果您有任何其他
InputStream
,则可以在scala中使用
Source.fromInputStream

表达式
str=br.readline()
生成类型
Unit
的返回值,该值始终不等于null。它应该给您一个关于将
Unit
与null进行比较的警告

你这样重构它是正确的


另外,@Jesper正确地评论了您的问题,这不是您通常在scala中读取文件的方式。因此,如果您这样做,请使用他的代码示例。如果您有任何其他的
InputStream
,您可以使用
源代码。从InputStream
Archeg已经很好地解释了这一点,请尝试以下方法:

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

}
既然您在Scala中工作,请尝试使用

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


Archeg已经很好地解释了这一点,请尝试以下方法:

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

}
既然您在Scala中工作,请尝试使用

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


有更多类似于Scala的方式读取文件内容,例如:
val sb=new StringBuilder;Source.fromFile(myFile).addString(sb)
@Jesper这里的问题是我正在使用一个Java库:)我会记住你的建议。有更多类似Scala的方法来读取文件内容,例如:
val sb=new StringBuilder;Source.fromFile(myFile).addString(sb)
@Jesper这里的问题是我正在使用一个Java库:)我会记住你的建议。