且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何使用java压缩文件夹本身

更新时间:2023-09-26 09:38:40

解决包 java.util.Zip 不需要任何额外的 Jar 文件



只需复制以下代码,并将 IDE 一起运行 / p>

  //导入所有需要的包
package general;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipUtils {

private List< String>的fileList;
private static final String OUTPUT_ZIP_FILE =Folder.zip;
private static final String SOURCE_FOLDER =D:\\Reports; // SourceFolder path

public ZipUtils(){
fileList = new ArrayList<字符串> ();
}

public static void main(String [] args){
ZipUtils appZip = new ZipUtils();
appZip.generateFileList(new File(SOURCE_FOLDER));
appZip.zipIt(OUTPUT_ZIP_FILE);
}

public void zipIt(String zipFile){
byte [] buffer = new byte [1024];
String source = new File(SOURCE_FOLDER).getName();
FileOutputStream fos = null;
ZipOutputStream zos = null;
try {
fos = new FileOutputStream(zipFile);
zos = new ZipOutputStream(fos);

System.out.println(Output to Zip:+ zipFile);
FileInputStream in = null;

(String file:this.fileList){
System.out.println(File Added:+ file);
ZipEntry ze = new ZipEntry(source + File.separator + file);
zos.putNextEntry(ze);
尝试{
in = new FileInputStream(SOURCE_FOLDER + File.separator + file);
int len;
while((len = in .read(buffer))> 0){
zos.write(buffer,0,len);
}
} finally {
in.close();
}
}

zos.closeEntry();
System.out.println(Folder successfully compressed);

} catch(IOException ex){
ex.printStackTrace();
} finally {
try {
zos.close();
} catch(IOException e){
e.printStackTrace();
}
}
}

public void generateFileList(File node){
//仅添加文件
if(node.isFile )){
fileList.add(generateZipEntry(node.toString()));
}

if(node.isDirectory()){
String [] subNote = node.list();
for(String filename:subNote){
generateFileList(new File(node,filename));
}
}
}

private String generateZipEntry(String file){
return file.substring(SOURCE_FOLDER.length()+ 1,file。长度());
}
}

参考 mkyong ..i改变了当前问题要求的代码


Suppose I have the following directory structure.

D:\reports\january\

Inside january there are suppose two excel files say A.xls and B.xls. There are many places where it has been written about how to zip files using java.util.zip. But I want to zip the january folder itself inside reports folder so that both january and january.zip will be present inside reports. (That means when I unzip the january.zip file I should get the january folder).

Can anyone please provide me the code to do this using java.util.zip. Please let me know whether this can be more easily done by using other libraries.

Thanks a lot...

It can be easily solved by package java.util.Zip no need any extra Jar files

Just copy the following code and run it with your IDE

    //Import all needed packages
package general;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipUtils {

    private List <String> fileList;
    private static final String OUTPUT_ZIP_FILE = "Folder.zip";
    private static final String SOURCE_FOLDER = "D:\\Reports"; // SourceFolder path

    public ZipUtils() {
        fileList = new ArrayList < String > ();
    }

    public static void main(String[] args) {
        ZipUtils appZip = new ZipUtils();
        appZip.generateFileList(new File(SOURCE_FOLDER));
        appZip.zipIt(OUTPUT_ZIP_FILE);
    }

    public void zipIt(String zipFile) {
        byte[] buffer = new byte[1024];
        String source = new File(SOURCE_FOLDER).getName();
        FileOutputStream fos = null;
        ZipOutputStream zos = null;
        try {
            fos = new FileOutputStream(zipFile);
            zos = new ZipOutputStream(fos);

            System.out.println("Output to Zip : " + zipFile);
            FileInputStream in = null;

            for (String file: this.fileList) {
                System.out.println("File Added : " + file);
                ZipEntry ze = new ZipEntry(source + File.separator + file);
                zos.putNextEntry(ze);
                try {
                    in = new FileInputStream(SOURCE_FOLDER + File.separator + file);
                    int len;
                    while ((len = in .read(buffer)) > 0) {
                        zos.write(buffer, 0, len);
                    }
                } finally {
                    in.close();
                }
            }

            zos.closeEntry();
            System.out.println("Folder successfully compressed");

        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {
                zos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public void generateFileList(File node) {
        // add file only
        if (node.isFile()) {
            fileList.add(generateZipEntry(node.toString()));
        }

        if (node.isDirectory()) {
            String[] subNote = node.list();
            for (String filename: subNote) {
                generateFileList(new File(node, filename));
            }
        }
    }

    private String generateZipEntry(String file) {
        return file.substring(SOURCE_FOLDER.length() + 1, file.length());
    }
}

Refer mkyong..i changed the code for the requirement of current question