scala - 如何在 Scala 中正确解压缩 gz 存档
问题描述
我是 Scala 的新手,我有一个小任务需要我*.gz file
从resources
目录中解压缩。所以我想要一种正确的方法来做到这一点,以便能够在之后解析文件内容。当然我过去读过一些文章,比如
:一
二三
我可以解析未归档但现在无法处理 gz 归档的文件内容。看起来我缺少一些小东西,因为我也是 Java 和 Scala 的新手。
斯卡拉版本- 2.21.0
我的部分代码如下:
object ResourceLoader {
def loadResource(fileName: String): Try[InputStream] = Try(getClass.getResourceAsStream(fileName))
def loadResource(fileName: String): Try[List[String]] =
for {
resourceStream <- loadResource(fileName)
resourceContent = Source.fromInputStream(resourceStream).getLines.toList
} yield resourceContent
}
然后我可以遍历未归档的文件,例如:
val content = ResourceLoader.loadResourceContent("/test_text.csv") recover {
case e: FileNotFoundException => println(s"Requested file not found: $e")
case e: SecurityException => println(s"Permission denied: $e")
case e: Exception => println(s"An unknown exception occurred: $e")
}
content.foreach(println)
但无法理解如何先解压缩 gz 存档然后对其进行迭代。
我希望在 loadResource 函数中使用 GZIPInputStream 而不是 getResourceAsStream 但不明白如何以正确的方式做到这一点。
预先感谢您的任何帮助!
解决方案
正如@Luis 评论的那样,这就是你可以做的:
val inputStream = Thread.currentThread().getContextClassLoader.getResourceAsStream("test_text.csv.gz")
val gzipFileSource: BufferedSource = Source.fromInputStream(new GZIPInputStream(inputStream))
println(gzipFileSource.getLines.toList.head)
推荐阅读
- javascript - 在 Angular 8 中监听 DOM 事件的最佳实践是什么?
- java - Mock private wrapper/primitive/String field
- flutter - 如何将 Flutter Chip 小部件的顶部和底部边距设置为零?
- angular - 如果另一个字段在 Angular 6 中有值,则需要输入
- window - OpenEdge ABL UI 冻结窗口直到弹出窗口关闭
- python-3.x - 在 Linux 上更改用户时保持 Python3 脚本运行
- python - 使用 Pandas 的数据透视表,在末尾添加额外的行并进行减法计算
- javascript - 如何在浏览器上使用 Octokit 的`request.js`?
- java - 包含 Xpath 中的函数
- r - 在多个页面/链接上使用 R 进行网页抓取