.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()
}
}
このvar ze: ZipEntry
のように変数ze
を定義します。そのため、タイプはZipEntry
であり、ZipEntry?
(nullableタイプ)ではありません。
var ze: ZipEntry
をvar ze: ZipEntry?
で変更すると、変数はnullになる可能性があります。
ドキュメントで Null Safety を確認できます。 Kotlinの大きな問題の1つです。
ここに私を導くこの機能を構築しようとすると、同様の問題がありました。 zipEntryをヌル可能にすると、zipEntryを言ったifステートメントでエラーがポップアップしましたか? zipEntryとの不一致です。zipEntryを使用して解決できました!! nullでないことを保証します。
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で働いている人がこの問題にぶつかった場合、私はそれが助けになることを願っています!