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