我目前正在编写一个可以创建zip文件的函数,该文件将用于其他功能。下面是我的函数代码:
public void createZip(){
try{
String outfile = this.filename + ".zip";
//input file
FileInputStream input = new FileInputStream(this.filename);
//output file
ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(outfile));
//name the file inside the zip file
System.out.println(this.filename);
zip.putNextEntry(new ZipEntry(this.filename));
byte[] buffer = new byte[this.BUFFER];
int len;
//copy the file to the zip
while((len= input.read(buffer)) > 0){
System.out.println(len);
zip.write(buffer, 0, len);
}
zip.closeEntry();
zip.flush();
input.close();
zip.close();
this.filename += ".zip";
}
catch(IOException e){
e.printStackTrace();
}
}
我试过调试,但我找不到这个问题的根源。该函数运行没有任何进一步的问题,但zip文件生成它是一个空的。
答案 0 :(得分:6)
您必须在关闭输出流之前使用ZipOutputStream#closeEntry()关闭该条目,否则该条目永远不会被确认为已完全写入。
此外,ZipEntry的名称不能是整个路径;即,它应该是dog.png
而不是C:\Users\Admin\Documents\dog.png
。此问题将毫无例外地传递,并将导致文件中的数据直接压缩到zip中,而不是压缩为压缩文件。
答案 1 :(得分:2)
好吧,只是想知道为什么你传递一个文件名作为参数,如果你不在代码中使用它.. 因为您总是使用this.filename。这让我觉得你试图用一个你设置为对象状态的名称命名一个zip文件,因为你也在ZipEntry中使用相同的名称,试图在其中添加相同的拉链文件..因为ZipEntry必须指向现有文件,这就是为什么它出现空白。
希望它有所帮助。
答案 2 :(得分:2)
final static byte[] EmptyZip={80,75,05,06,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00};
public static void createEmptyZip(String path){
try{
FileOutputStream fos=new FileOutputStream(new File(path));
fos.write(EmptyZip, 0, 22);
fos.flush();
fos.close();
}catch (FileNotFoundException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
答案 3 :(得分:0)
尝试在关闭之前使用zip.flush()来刷新缓冲区,尽管close应该刷新缓冲区。
同时验证this.filename。您有一个具有相同名称的本地变量。永远不会使用本地变量filename。 zip文件可能被写入不同于您期望的位置。
答案 4 :(得分:0)
@phillipe请试试这个
public void createZip(String filename) {
try {
//input file
FileInputStream input = new FileInputStream(filename);
//output file
ZipOutputStream zip = new ZipOutputStream(new FileOutputStream(filename + ".zip"));
//name the file inside the zip file
zip.putNextEntry(new ZipEntry(filename));
byte[] buffer = new byte[1024];
int len;
//copy the file to the zip
while((len = input.read(buffer)) > 0) {
System.out.println();
zip.write(buffer, 0 , len);
}
zip.closeEntry();
zip.flush();
zip.close();
input.close();
filename += ".zip";
} catch(IOException e) {
e.printStackTrace();
}
}
这些代码创建了一个zip文件,这也适用于我。 :)
答案 5 :(得分:0)
简单的解决方案。在没有文件分隔符的ZipEntry
中创建一个手动目录。
zip.putNextEntry(new ZipEntry("LOG" + fileName));
而不是
zip.putNextEntry(new ZipEntry(fileName));
此处fileName = file.getAbsoluteFile();
首先在zip文件中创建LOG目录,然后在目录路径下创建fileNames。这样可以避免在zip文件中创建初始的空目录。