我有一个要求,我必须有两个文件夹,并且每个文件夹都必须转换为各自的zip文件。这是我正在使用的当前代码。
fun zipFolder(inputFolderPath: String, outZipPath: String) {
try {
val fos = FileOutputStream(outZipPath)
val zos = ZipOutputStream(fos)
val srcFile = File(inputFolderPath)
if (!srcFile.exists()) {
Timber.e("Src file ${srcFile.path} does not exist..")
return
}
val files = srcFile.listFiles()
Timber.d("Zip directory: " + srcFile.name)
for (i in files.indices) {
Log.d("", "Adding file: " + files[i].name)
val buffer = ByteArray(2048)
val fis = FileInputStream(files[i])
zos.putNextEntry(ZipEntry(files[i].name))
while (fis.read(buffer) > 0) {
zos.write(buffer, 0, fis.read(buffer))
}
zos.closeEntry()
fis.close()
}
zos.close()
} catch (e: IOException) {
Timber.e(e)
}
}
但是由于某种原因,在此过程中我得到了IndexOutOfBounds异常。
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=234, result=-1, data=Intent { cmp=proj.com.wimwiiftkagent/proj.com.inspection.ui.InspectionProcedureActivity (has extras) }} to activity {proj.com.wimwiiftkagent/proj.com.wimwiiftkagent.ui.inspection.InspectionActivity}: java.lang.IndexOutOfBoundsException
at android.app.ActivityThread.deliverResults(ActivityThread.java:4440)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4484)
at android.app.ActivityThread.-wrap19(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1743)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6753)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:482)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.IndexOutOfBoundsException
at java.util.zip.ZipOutputStream.write(ZipOutputStream.java:322)
at proj.com.wimwiiftkagent.utils.FileUtils.zipFolder(FileUtils.kt:31)
at proj.com.wimwiiftkagent.ui.inspection.InspectionActivity.processInspectionData(InspectionActivity.kt:59)
at proj.com.wimwiiftkagent.ui.inspection.InspectionActivity.onActivityResult(InspectionActivity.kt:77)
at android.app.Activity.dispatchActivityResult(Activity.java:7317)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4436)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4484)
at android.app.ActivityThread.-wrap19(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1743)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6753)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:482)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
不用担心Failure delivering result
。仅仅是因为在onActivityResult()
回调中调用了此压缩代码,因为要压缩的文件夹路径是由于另一个活动的结果而传递的。
如何解决此问题?
答案 0 :(得分:0)
可能是在while循环中,您正在循环部分和循环主体中调用fis.read(buffer)。进行while检查时,尝试设置变量。
while (val data = fis.read(buffer)) {
zos.write(buffer, 0, data)
}
答案 1 :(得分:0)
典型的Java语法是:
int c;
while ((c = fid.read(buffer)) >= 0) {
zos.write(buffer, 0, c);
}
在Kotlin中,您不能做同样的事情,因为赋值不是表达式。要在Kotlin中执行相同的操作,您需要使用if
和break
的do / while循环。
但是几乎没有必要; Kotlin的标准库具有一个扩展功能,可以为您处理此问题:copyTo
。而且,如果您使用use
方法,则也不必处理输入流的关闭。这会使您的方法变成:
for (f in files) {
Log.d("", "Adding file: " + f.name)
zos.putNextEntry(ZipEntry(f.name))
val fis = FileInputStream(f)
fis.use { fis.copyTo(zos, 2048) }
zos.closeEntry()
}