2010-12-16 47 views
20

在许多例子中,描述的是你可以使用scala.io.Source读取整个文件是这样的:什么是使用scala.io.Source的正确方法?

val str = scala.io.Source.fromFile("test.txt").mkString() 

但关闭底层流没有提及。 为什么Scala不提供一个方便的方法来实现这一点,比如Python中的clause?它看起来很有用但并不难。

是否还有其他更好的方法可以在Scala中安全地执行该操作,我的意思是读取整个文件?

+0

它是使用权来源这种方式不关闭底层流? – woods 2010-12-17 05:13:09

+4

如果您阅读scala.io.Source的代码,您会发现实际上它会将关闭基础流的工作留给您。惊人! – woods 2010-12-22 07:57:02

回答

18

斯卡拉的io库只是为了提供有限需求的支持而完成的。曾经努力为斯卡拉提供一个精心思考的io库,该库目前在assembla上托管,同时还有一个github存储库。

如果您打算使用I/O来读取短期流程中的偶然文件,最好使用Java库或查看编译器中当前可用的I/O支持这将需要scala-compiler.jar与应用程序一起分发)。

至于自动资源管理,请看this questionthis library(该问题在该问题的接受答案中有所提及)。

+1

你还会推荐2016年不使用scala.io吗? – knub 2016-03-11 13:08:45

+3

@knub我没有看Scala 2.12,看看有没有改进,但是,否则,是的,我坚持相同的建议。 – 2016-03-16 03:48:16

20

为了完整

val testTxtSource = scala.io.Source.fromFile("test.txt") 
val str = testTxtSource.mkString() 
testTxtSource.close() 

起见应该把事情做好。

+5

不应该在'try'块中并且'finally'块中的close()'? – robinst 2012-05-23 13:28:02

+1

@robinst这将是一件好事,我同意丹尼尔的回答(即不要使用scala.io.Source)但是,它在我们不写代码的Dojos中非常有用。另外,我会使用一个ARM库(而不是'try'' catch'),因为'close()'也会抛出一个异常,我发现在finally中有一个'try'' catch'' finally '。 – matyjas 2012-05-29 12:18:16

2

我建议using the using,这使得你的代码更简洁,更可靠

using(Source.fromFile("test.txt")){ _.mkString()} 
相关问题