在scala中解压缩并读取gzip文件

Eth*_*anP 10 gzip scala scalding

在Scala中,如何解压缩包含的文本file.gz以便可以处理它?我很高兴将文件的内容存储在变量中,或者将其保存为本地文件,以便以后可以通过程序读入.

具体来说,我使用Scalding处理压缩日志数据,但Scalding没有定义读取它们的方法FileSource.scala.

dhg*_*dhg 20

这是我的版本:

import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.zip.GZIPInputStream
import java.io.FileInputStream

class BufferedReaderIterator(reader: BufferedReader) extends Iterator[String] {
  override def hasNext() = reader.ready
  override def next() = reader.readLine()
}

object GzFileIterator {
  def apply(file: java.io.File, encoding: String) = {
    new BufferedReaderIterator(
      new BufferedReader(
        new InputStreamReader(
          new GZIPInputStream(
            new FileInputStream(file)), encoding)))
  }
}
Run Code Online (Sandbox Code Playgroud)

然后做:

val iterator = GzFileIterator(new java.io.File("test.txt.gz"), "UTF-8")
iterator.foreach(println)
Run Code Online (Sandbox Code Playgroud)

  • 在此[帖子](http://stackoverflow.com/questions/5244839/does-bufferedreader-ready-method-ensure-that-readline-method-does-not-return)中对此进行了讨论:“...结果调用ready()绝对不会告诉你从read()调用中返回的内容,因此不能用于忽略空检查。” 我正在使用迭代器从 S3 存储桶读取 .gz 文本文件,并且迭代器中的一些行生成了空对象。然后我更改为我附加的迭代器的实现并不再遇到这种行为。 (2认同)