Es gibt mehrere Dateien in einer ZIP-Datei, die ich versuche zu bekommen. Beim Versuch, die Dateien zu entpacken, wird eine Java.lang.IllegalStateException bereitgestellt: zis.nextEntry darf nicht null sein. Wie mache ich es richtig?
@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()
}
}
Die ZipEntry
, die Sie aus dem Stream lesen, wird null
sein, wenn Sie das Ende der Datei erreichen. Daher müssen Sie die Variable, die Sie speichern, in nullfähig machen:
var ze: ZipEntry?
Sie durften die gelesenen Werte einer nicht-nullfähigen Variablen zuweisen, da sie den Plattformtyp ZipEntry!
hatte, da es sich um eine Java-API handelt. In diesem Fall müssen Sie feststellen, ob es sich um null
handeln kann. Weitere Informationen finden Sie in den Plattformtypen docs about.
Die Variable ze
definieren Sie wie folgt var ze: ZipEntry
. Der Typ ist also ZipEntry
und nicht ZipEntry?
(nullfähiger Typ).
Wenn Sie var ze: ZipEntry
durch var ze: ZipEntry?
ändern, kann die Variable null sein.
Sie können das Dokument auf Null Safety überprüfen. Bei Kotlin ist das eine der großen Sachen.
Ich hatte ein ähnliches Problem, als ich versuchte, diese Funktionalität aufzubauen, die mich hierherführt. Sobald ich zipEntry nullable gemacht habe, tauchte ein Fehler in einer if-Anweisung auf, in der zipEntry stand. ist ein Missverhältnis zu zipEntry, das konnte ich mit zipEntry lösen !! garantieren, dass es nicht null war.
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
Dies war die Lösung, die ich herausfinden konnte.
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
Wenn jemand, der in Kotlin arbeitet, auf dieses Problem stößt, hoffe ich, dass es helfen kann!