Java 7引入了自动资源管理:
try (BufferedReader br = new BufferedReader(new FileReader(path))) {
return br.readLine();
}
这适用于任何实现java.lang.AutoClosable
的类。
我知道有几个在Scala中进行自动资源管理的例子,包括Martin Odersky演示的一个例子。
是否有计划向Scala添加语言级资源管理,类似于Java的try(...) { }
?
答案 0 :(得分:13)
在scala中,可以将其添加为库。作为jsuereth的示例scala-arm(https://github.com/jsuereth/scala-arm):
势在必行的风格:
// Copy input into output.
for(input <- managed(new java.io.FileInputStream("test.txt");
output <- managed(new java.io.FileOutputStream("test2.txt")) {
val buffer = new Array[Byte](512)
while(input.read(buffer) != -1) {
output.write(buffer);
}
}
Monadic风格
val first_ten_bytes = managed(new FileInputStream("test.txt")) map {
input =>
val buffer = new Array[Byte](10)
input.read(buffer)
buffer
}
在github页面上还有一些例子
答案 1 :(得分:3)
我不知道在Scala中专门为此设计的Trait,但这是一个使用Java Closable上的贷款模式的例子:
http://whileonefork.blogspot.com/2011/03/c-using-is-loan-pattern-in-scala.html
修改强>
您甚至可以通过以下方式制作更通用的借用:
答案 2 :(得分:2)
Scala规范很薄,因为几乎所有可以通过标准库实现的东西都是。因此,没有必要在语言本身中添加ARM。
到目前为止,Scala还没有真正的IO API(默认使用Java IO API)。未来的Scala IO API很可能包含某种形式的ARM。例如,scala-io具有ARM。
答案 3 :(得分:0)
更好的文件包含轻量级(10行代码)ARM。请参阅:https://github.com/pathikrit/better-files#lightweight-arm
import better.files._
for {
in <- inputStream.autoClosed
out <- outputStream.autoClosed
} in.pipeTo(out)
// The input and output streams are auto-closed once out of scope