.zip文件中有多个文件,我试图获取。尝试解压缩文件提供了java.lang.IllegalStateException:zis.nextEntry不能为null。如何正确地做到这一点?
@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()
}
}
答案 0 :(得分:7)
当您到达文件末尾时,您从流中读取的ZipEntry
将为null
,因此您必须将存储它的变量设置为可空:
var ze: ZipEntry?
您被允许将您读取的值分配给非可空变量,因为它们具有平台类型ZipEntry!
,因为它是Java API - 在这种情况下您必须确定它是否可以null
。有关详细信息,请参阅有关平台类型的docs。
答案 1 :(得分:2)
您可以像ze
一样定义变量var ze: ZipEntry
。所以类型是ZipEntry
而不是ZipEntry?
(可空类型)。
如果您将var ze: ZipEntry
更改为var ze: ZipEntry?
,则该变量可以为空。
您可以查看Null Safety的文档。这是Kotlin最重要的事情之一。
答案 2 :(得分:0)
在尝试构建将我引向此处的功能时,我遇到了类似的问题。一旦我将zipEntry设置为可空,在if语句中会弹出一个错误,提示zipEntry?与zipEntry不匹配,我可以通过使用zipEntry解决它!保证它不为空。
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
这是我能够解决的解决方案。
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
如果在Kotlin工作的任何人遇到此问题,希望对您有所帮助!