Scala的Java 7风格自动资源管理

时间:2011-09-16 11:21:31

标签: java scala

Java 7引入了自动资源管理:

try (BufferedReader br = new BufferedReader(new FileReader(path))) {
  return br.readLine();
}

这适用于任何实现java.lang.AutoClosable的类。

我知道有几个在Scala中进行自动资源管理的例子,包括Martin Odersky演示的一个例子。

是否有计划向Scala添加语言级资源管理,类似于Java的try(...) { }

4 个答案:

答案 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

修改

您甚至可以通过以下方式制作更通用的借用:

https://stackoverflow.com/questions/5945904/what-are-your-most-useful-own-library-extensions/5946514#5946514

答案 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