使用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
}