В следующем фрагменте кода я пытаюсь извлечь файл .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
должен легко обрабатывать оба формата!Есть идеи?