There are multiple files in a .zip file, which I'm trying to get. Trying to unzip the files provides a java.lang.IllegalStateException: zis.nextEntry must not be null. How to do it the right way?
@Throws(IOException::class)
fun unzip(zipFile: File, targetDirectory: File) {
val zis = ZipInputStream(
BufferedInputStream(FileInputStream(zipFile)))
try {
var ze: ZipEntry
var count: Int
val buffer = ByteArray(8192)
ze = zis.nextEntry
while (ze != null) {
val file = File(targetDirectory, ze.name)
val dir = if (ze.isDirectory) file else file.parentFile
if (!dir.isDirectory && !dir.mkdirs())
throw FileNotFoundException("Failed to ensure directory: " + dir.absolutePath)
if (ze.isDirectory)
continue
val fout = FileOutputStream(file)
try {
count = zis.read(buffer)
while (count != -1) {
fout.write(buffer, 0, count)
count = zis.read(buffer)
}
} finally {
fout.close()
zis.closeEntry()
ze = zis.nextEntry
}
}
} finally {
zis.closeEntry()
zis.close()
}
}
You define the variable
ze
like thisvar ze: ZipEntry
. So the type isZipEntry
and notZipEntry?
(nullable type).If you change
var ze: ZipEntry
byvar ze: ZipEntry?
, the variable can be null.You can check the doc for Null Safety. It's one of the big thing with Kotlin.
I had a similar issue when trying to build this functionality that lead me here. Once I made zipEntry nullable an error popped up in an if statement which said zipEntry? is a mismatch to zipEntry, I was able to solve that by using zipEntry!! guaranteeing it was not null.
This was the solution I was able to work out.
If anyone working in Kotlin runs into this issue I hope it can help!
The
ZipEntry
you read from the stream will benull
when you reach the end of the file, so you have to make the variable that you store it in nullable:You were allowed to assign the values you read to a non-nullable variable because they had the platform type
ZipEntry!
, since it's a Java API - in this case you have to determine whether it can benull
. See the docs about platform types for more information.