使用Scala ARM库读取简单文件

Mar*_*ila 6 scala

我正在使用ARM库将资源文件读入字符串.我正在使用的代码是这样的:

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)
}
Run Code Online (Sandbox Code Playgroud)

它看起来有点怪我,尤其是最后一部分acquireAndGetidentity.有没有更好的办法 ?

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

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

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

我在ManagedResource返回的地图上看到了这个地图ExtractableManagedResource,我可以使用该opt方法从中提取结果.flatMap只返回一个ManagedResource.是否有一个原因 ?

pag*_*_5b 3

我也觉得很奇怪,map应该flatMap以稍微不同的方式表现。
也许映射操作可以更自由地公开无法通过 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
}
Run Code Online (Sandbox Code Playgroud)

警告:代码未经测试