如何在不使用 ant 的情况下压缩 groovy 中的文件?

How to zip files in groovy not using ant?

我需要使用 groovy 将文件压缩到一个目录中——尽管不使用 ant。

我已经试用了在网上找到的代码的两个版本。

1) 如果我注释掉整个 InputStream 部分,则会创建包含所有文件的 zip 文件。但文件大小为 0。

import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream

String zipFileName = "output.zip"  
String inputDir = "c:/temp"

ZipOutputStream output = new ZipOutputStream(new FileOutputStream(zipFileName))

byte[] buf = new byte[1024]

new File(inputDir).eachFile() { file ->  
 println file.name.toString()
 println file.toString()

  output.putNextEntry(new ZipEntry(file.name.toString())) // Create the name of the entry in the ZIP

  InputStream input = file.getInputStream() // Get the data stream to send to the ZIP
  // Stream the document data to the ZIP
  int len;
  while((len = input.read(buf)) > 0){
    output.write(buf, 0, len);
    output.closeEntry(); // End of document in ZIP
  }
}  
output.close(); // End of all documents - ZIP is complete

2) 如果我尝试使用此代码,则创建的 zip 文件中的文件大小不正确。最大尺寸为 1024。

import java.util.zip.ZipOutputStream  
import java.util.zip.ZipEntry  
import java.nio.channels.FileChannel  


String zipFileName = "output.zip"  
String inputDir = "c:/temp"

ZipOutputStream output = new ZipOutputStream(new FileOutputStream(zipFileName))

new File(inputDir).eachFile() { file ->  
  zipFile.putNextEntry(new ZipEntry(file.getName()))  
  def buffer = new byte[1024]  
  file.withInputStream { i ->  
    l = i.read(buffer)  
    // check wether the file is empty  
    if (l > 0) {  
      zipFile.write(buffer, 0, l)  
    }  
  }  
  zipFile.closeEntry()  
}  
zipFile.close()

不确定获取InputStream的方法是否正确。我可以使用 new FileInputStream(file);

创建一个

从第一个例子改进而来,使用 Java 7

import java.nio.file.Files
import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream

String zipFileName = "c:/output.zip"
String inputDir = "c:/temp"

ZipOutputStream output = new ZipOutputStream(new FileOutputStream(zipFileName))


new File(inputDir).eachFile() { file ->
    if (!file.isFile()) {
        return
    }
    println file.name.toString()
    println file.toString()

    output.putNextEntry(new ZipEntry(file.name.toString())) // Create the name of the entry in the ZIP

    InputStream input = new FileInputStream(file);

    // Stream the document data to the ZIP
    Files.copy(input, output);
    output.closeEntry(); // End of current document in ZIP
    input.close()
}
output.close(); // End of all documents - ZIP is complete

根据您自己的编码,省略此行即可。

output.closeEntry();