I am using the ARM library to read a resource file into a string. The code I'm using is this:
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)
}
It looks a bit weird to me, especially the last part with acquireAndGet
of identity
. Is there a better way ?
The general question would be, how would you use this style to do something like this
val x: String=
for (res1 <- managed(...);
res2 <- managed(...);
...
resn <- managed) yield {
f(res1, res2, ..., resn)
}
The behavior is that if the operations within the for comprehension fail I would like the exception to be propagated out of the method and the resources should be closed.
I saw that map on a ManagedResource
returns an ExtractableManagedResource
from which I can extract the result using the opt
method. flatMap
returns only a ManagedResource
. Is there a reason for this ?
I find it weird too that map
and flatMap
should behave in a slightly different way.
Maybe the mapping operation gives more freedom to expose a simplified result that can't be obtained through flatMap.
Anyway you could structure the code as follows to get something that looks more appealing
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
}
warn: the code is not tested
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With