Ошибка при извлечении файлов .tgz с использованием Apache Commons Compress - PullRequest
0 голосов
/ 11 октября 2018

В следующем фрагменте кода я пытаюсь извлечь файл .tgz с помощью библиотеки Apache Commons Compress, но я получаю исключение, которое говорит мне, что ему не нравится формат файла.Вот фрагмент кода, метод ниже является частью исходного файла с именем FileUtils.scala:

def extractTGZ(from: File, outputPath: String): Unit = {
    var fileCount: Int = 0
    var dirCount: Int = 0
    print(s"Extracting files from ${from.getAbsolutePath}")
    val tais = new TarArchiveInputStream(new GzipCompressorInputStream(new BufferedInputStream(new FileInputStream(from))))
    Try {
      @tailrec
      def readTarArchiveEntry(entry: TarArchiveEntry): Unit = {
        println("Extracting file: " + entry.getName)

        // Create directories as required
        if (entry.isDirectory) {
          new File(outputPath + entry.getName).mkdirs
          dirCount += 1
        } else {
          val data = new Array[Byte](BUFFER_SIZE)
          val fos = new FileOutputStream(outputPath + entry.getName)
          val dest = new BufferedOutputStream(fos, BUFFER_SIZE)

          var count = tais.read(data, 0, BUFFER_SIZE)

          while (count != -1) {
            dest.write(data, 0, count)
            count = tais.read(data, 0, BUFFER_SIZE)
          }
          dest.close()
          fileCount += 1
        }
        if (fileCount % 1000 == 0) print(".")

        // Check if we have some more files in the compressed archive
        val nextEntry = tais.getNextEntry.asInstanceOf[TarArchiveEntry]
        if (nextEntry != null) readTarArchiveEntry(nextEntry) else ()
      }

      readTarArchiveEntry(tais.getNextEntry.asInstanceOf[TarArchiveEntry])

    } recover {
      case t: Throwable =>
        println(s"Unexpected exception occurred when de-compressing files ${t.getMessage}")
        if (tais != null) tais.close()
    }
    println("\n" + fileCount + " files and " + dirCount + " directories extracted to: " + outputPath)
  }

Вот ошибка, которую я получаю при запуске!

Extracting files from /Users/joe/ml-projects/housing-classification-example-scala/datasets/housing/raw/housing.tgz[error] (run-main-0) java.io.IOException: Input is not in the .gz format
[error] java.io.IOException: Input is not in the .gz format
[error]     at org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream.init(GzipCompressorInputStream.java:164)
[error]     at org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream.<init>(GzipCompressorInputStream.java:137)
[error]     at org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream.<init>(GzipCompressorInputStream.java:102)
[error]     at com.inland24.housingml.FileUtils$.extractTGZ(FileUtils.scala:20)
[error]     at com.inland24.housingml.FileUtils$.extractTGZ(FileUtils.scala:62)

Любойподсказки, почему он не принял бы такой .tgz формат файла?Насколько я понимаю, .tgz так же хорош, как tar.gz, и GzipCompressorInputStream должен легко обрабатывать оба формата!Есть идеи?

...