如何在groovy中压缩文件而不使用ant?

时间:2015-01-07 03:24:23

标签: groovy zip

我需要使用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()

2 个答案:

答案 0 :(得分:3)

不确定获取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

答案 1 :(得分:0)

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

output.closeEntry();