Il y a plusieurs fichiers dans un fichier .Zip, que j'essaie d'obtenir. Essayer de décompresser les fichiers fournit une exception Java.lang.IllegalStateException: zis.nextEntry ne doit pas être null. Comment le faire de la bonne façon?
@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()
}
}
La ZipEntry
que vous avez lue dans le flux sera null
lorsque vous atteindrez la fin du fichier. Vous devez donc rendre la variable que vous stockez en nullable:
var ze: ZipEntry?
Vous avez été autorisé à affecter les valeurs que vous avez lues à une variable non nullable car elles avaient le type de plate-forme ZipEntry!
, puisqu'il s'agit d'une API Java. Dans ce cas, vous devez déterminer si elle peut être null
. Voir les docs sur les types de plateformes pour plus d’informations.
Vous définissez la variable ze
comme ceci var ze: ZipEntry
. Donc, le type est ZipEntry
et pas ZipEntry?
(type nullable).
Si vous modifiez var ze: ZipEntry
par var ze: ZipEntry?
, la variable peut être null.
Vous pouvez consulter le doc pour Null Safety . C'est l'un des gros truc avec Kotlin.
J'ai eu un problème similaire en essayant de construire cette fonctionnalité qui m'a conduit ici. Une fois que j'ai rendu zipEntry nullable une erreur est apparue dans une instruction if qui disait zipEntry? est une incompatibilité pour zipEntry, j'ai pu résoudre ce problème en utilisant zipEntry !! en garantissant que ce n'était pas nul.
while(zippedFile != null) {
fileName = zippedFile.name //It wasn't able to smart cast once zipEntry was nullable
if (zippedFile.isDirectory) {} //Here it had a type mismatch
C’est la solution que j’ai pu trouver.
while(zippedFile != null) {
fileName = zippedFile!!.name //Adding !! (not null) allowed it to safely smart cast
if (zippedFile!!.isDirectory) {} //Here adding not null removed the type mismatch
Si quelqu'un qui travaille à Kotlin rencontre ce problème, j'espère que cela pourra aider!