使用Scala ARM库读取简单文件

使用Scala ARM库读取简单文件,scala,Scala,我正在使用将资源文件读入字符串。我使用的代码是: def readResource(reosurceName: String): String = { val res = for (writer <- managed(new StringWriter); is <- managed(this.getClass.getClassLoader.getResourceAsStream(resourceName))) yield { IO

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

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)
}
其行为是,如果for comprehension中的操作失败,我希望将异常传播到方法之外,并关闭资源


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

我也觉得奇怪,
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
}
警告:代码未经测试

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
}