相关疑难解决方法(0)

如何在 Kotlin 中使用 ZipOutputStream 压缩文件夹和子文件夹及其中的文件?

我有排列在不同目录中的文件列表,某些目录中会有子目录和文件。我无法成功地将相同的目录结构放入 zip 文件中。这是我的代码:

fun zipAll(directory: String, zipFile: String) {
val sourceFile = File(directory)

 ZipOutputStream(BufferedOutputStream(FileOutputStream(zipFile))).use {
       zipFiles(it, sourceFile)
   }
}

private fun zipFiles(zipOut: ZipOutputStream, directory: File) {

val data = ByteArray(1024)

zipOut.use {

    if (directory.isDirectory) {
        //Adding directory
        it.putNextEntry(ZipEntry(directory.name))
    } else {
        zipFiles(zipOut, directory)
    }

    for (f in directory.listFiles()) {

        if (!f.name.contains(".zip") && f.exists()) {

            //Adding file

            FileInputStream(f).use { fi ->
                BufferedInputStream(fi).use { origin ->
                    val entry = ZipEntry(f.name)
                    it.putNextEntry(entry)
                    while (true) {
                        val readBytes = origin.read(data)
                        if (readBytes == -1) …
Run Code Online (Sandbox Code Playgroud)

android kotlin

11
推荐指数
2
解决办法
6958
查看次数

ZipOutputStream - closeEntry()first或close()first

以下是一些代码的一部分.我需要在finally子句中关闭资源.我需要先调用closeEntry()还是close()?我收到一些错误消息.

Error closing the zipoutjava.io.IOException: Stream closed at 
  java.util.zip.ZipOutputStream.ensureOpen(ZipOutputStream.java:70) at 
  java.util.zip.ZipOutputStream.closeEntry(ZipOutputStream.java:189)
Run Code Online (Sandbox Code Playgroud)

代码

 ZipOutputStream zos = null;

  try{

    ZipEntry entry = new ZipEntry("file.csv")
    zipout.putNextEntry(entry);
            csvBeanWriter = new CsvBeanWriter(writer,
                    CsvPreference.STANDARD_PREFERENCE);
            csvBeanWriter.writeHeader(header);
            for (Book book : bookList) {
                csvBeanWriter.write(book, header);
                csvBeanWriterTest.write(book, header);

            }

        } catch (Exception e) {
            logger.error("Export of package data failed: "
                    + e);

        } finally {

            if (zipout != null) {
                try {
                    zos.closeEntry();
                    zos.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    logger.error("Error closing the zos"
                            + …
Run Code Online (Sandbox Code Playgroud)

java zipoutputstream

1
推荐指数
1
解决办法
8856
查看次数

标签 统计

android ×1

java ×1

kotlin ×1

zipoutputstream ×1