ZipInputStream.read в ZipEntry

Я читаю zip-файл, используя ZipInputStream. Zip-файл содержит 4 CSV-файла. Некоторые файлы написаны полностью, некоторые написаны частично. Пожалуйста, помогите мне найти проблему с кодом ниже. Есть ли ограничения на чтение буфера из метода ZipInputStream.read?

val zis = new ZipInputStream(inputStream)
Stream.continually(zis.getNextEntry).takeWhile(_ != null).foreach { file =>
      if (!file.isDirectory && file.getName.endsWith(".csv")) {
        val buffer = new Array[Byte](file.getSize.toInt)
        zis.read(buffer)
        val fo = new FileOutputStream("c:\\temp\\input\\" + file.getName)
        fo.write(buffer)
 }

1 ответ

Решение

Вы не closeд /flushредактировал файлы, которые вы пытались написать. Это должно быть что-то вроде этого (при условии синтаксиса Scala, или это Котлин / Цейлон?):

    val fo = new FileOutputStream("c:\\temp\\input\\" + file.getName)
    try {
      fo.write(buffer)
    } finally {
      fo.close
    }

Также вы должны проверить счетчик чтения и, если необходимо, прочитать больше, примерно так:

var readBytes = 0
while (readBytes < buffer.length) {
  val r = zis.read(buffer, readBytes, buffer.length - readBytes)
  r match {
    case -1 => throw new IllegalStateException("Read terminated before reading everything")
    case _ => readBytes += r
  }
}

PS: в вашем примере это, кажется, меньше, чем требуется закрытия }s.

Другие вопросы по тегам