加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用Scala ARM库读取简单文件

发布时间:2020-12-16 18:43:22 所属栏目:安全 来源:网络整理
导读:我使用 ARM library将资源文件读入字符串.我正在使用的代码是这样的: def readResource(reosurceName: String): String = { val res = for (writer - managed(new StringWriter); is - managed(this.getClass.getClassLoader.getResourceAsStream(resourceN
我使用 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)
}

对我来说这看起来有点奇怪,尤其是最后一部分具有identAndGet的身份.有没有更好的办法 ?

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

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

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

我看到ManagedResource上的map返回一个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
}

警告:代码未经过测试

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读