Как правильно распаковать архив gz в Scala - PullRequest
1 голос
/ 10 мая 2019

Я новичок в Scala, и у меня есть небольшая задача, которая требует от меня распаковки *.gz file из каталога resources.Поэтому я хочу, чтобы это был правильный способ, чтобы иметь возможность анализировать содержимое файла после.Конечно, я читал некоторые статьи в прошлом, такие как: ONE TWO THREE

Я могу анализировать содержимое файла, который не был архивирован, но не могуобращаться с архивом gz прямо сейчас.Похоже, мне не хватает чего-то маленького, так как я новичок в Java и в Scala.

Версия 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, а затем перебрать его.

Я ожидаю использовать GZIPInputStream вместо getResourceAsStream в функции loadResource, но не могу понять, как это сделать правильно.

Заранее благодарю за любую помощь!

1 Ответ

4 голосов
/ 13 мая 2019

Как прокомментировал @Luis, это то, что вы можете сделать:


val inputStream = Thread.currentThread().getContextClassLoader.getResourceAsStream("test_text.csv.gz")
val gzipFileSource: BufferedSource = Source.fromInputStream(new GZIPInputStream(inputStream))

println(gzipFileSource.getLines.toList.head)
...