Scala 中的数据压缩

2023-12-28

下面是我尝试实现一个提供压缩/解压缩字符串功能的类:

object GZipHelper {

  def deflate(txt: String): Try[String] = {
    try {
      val arrOutputStream = new ByteArrayOutputStream()
      val zipOutputStream = new GZIPOutputStream(arrOutputStream)
      zipOutputStream.write(txt.getBytes)
      new Success(Base64.encodeBase64String(arrOutputStream.toByteArray))
    } catch {
      case _: e => new Failure(e)
    }
  }

  def inflate(deflatedTxt: String): Try[String] = {
    try {
      val bytes = Base64.decodedBase64(deflatedTxt)
      val zipInputStream = GZIPInputStream(new ByteArrayInputStream(bytes))
      new success(IOUtils.toString(zipInputStream))
    } catch {
      case _: e => new Failure(e)
    }
  }
}

如您所见,finally关闭的块GZIPOutputStream and GZIPInputStream丢失了...我怎样才能以“scala”方式实现这个?我该如何改进代码?


由于您使用的是“老式”try语句并显式地将其转换为scala.util.Try,确实没有理由不添加finally在你之后阻止try.

但在这种特定情况下,关闭没有什么意义,例如,您的ByteArrayInputStream- 它并不是真正的开放资源,不需要关闭。在这种情况下,您可以通过以下方式简化代码并使其更加惯用:

def inflate(deflatedTxt: String): Try[String] = Try {
   val bytes = Base64.decodedBase64(deflatedTxt)
   val zipInputStream = GZIPInputStream(new ByteArrayInputStream(bytes))
   IOUtils.toString(zipInputStream)
}

我个人不会声明bytes and zipInputStream因为它们只使用一次,但这是一个偏好问题。

这里的技巧是有一个finally阻止调用scala.util.Try.apply- 如果不打电话的话我不确定这是否可能map这实际上并没有改变任何东西,这对我来说似乎有点疏忽。我期待看到一个andThen or eventually中的方法scala.util.Try,但它似乎还不存在(还?)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 中的数据压缩 的相关文章

随机推荐