使用Scala ARM库读取简单文件

时间:2012-12-12 10:19:00

标签: scala

我正在使用ARM library将资源文件读入字符串。我正在使用的代码是:

def readResource(reosurceName: String): String = {
  val res = for (writer <- managed(new StringWriter);
                 is     <- managed(this.getClass.getClassLoader.getResourceAsStream(resourceName))) yield {
    IOUtils.copy(is, writer)
    writer.toString
  }
  res.acquireAndGet(identity)
}

对我来说这看起来有点奇怪,尤其是acquireAndGet identity的最后一部分。还有更好的方法吗?

一般的问题是,你将如何使用这种风格来做这样的事情

val x: String=
  for (res1 <- managed(...);
       res2 <- managed(...);
       ...
       resn <- managed) yield {
      f(res1, res2, ..., resn)
  }

行为是,如果for comprehension中的操作失败,我希望将异常传播出该方法,并且应该关闭资源。

我在ManagedResource上看到该地图返回ExtractableManagedResource,我可以使用opt方法从中提取结果。 flatMap仅返回ManagedResource。有这个原因吗?

1 个答案:

答案 0 :(得分:3)

我发现mapflatMap的行为方式略有不同,我觉得很奇怪。
也许映射操作可以更自由地暴露无法通过flatMap获得的简化结果。

无论如何,您可以按如下方式构造代码,以获得看起来更具吸引力的内容

def readResource(resourceName: String): Option[String] = {
  val managedWriter = {
      managed(new StringWriter) and
      managed(this.getClass.getClassLoader.getResourceAsStream(resourceName))
    } map { case (writer, is) => 
        IOUtils.copy(is, writer)
        writer.toString
    }
  }
  managedWriter.opt
}

警告:代码未经过测试