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.