Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 压缩子目录仅压缩子目录的内容,而不压缩子目录_Java_File_Zip - Fatal编程技术网

Java 压缩子目录仅压缩子目录的内容,而不压缩子目录

Java 压缩子目录仅压缩子目录的内容,而不压缩子目录,java,file,zip,Java,File,Zip,下面是我试过的代码。它只压缩子文件夹的内容,而不压缩文件夹 我需要压缩所有子文件夹以及内容。我在这里做错了什么。 示例:我在demo文件夹中有一个文件夹“demo”,我有a、b、c文件夹。我想压缩a,b,c以及内容和压缩不应该包括家长是演示 static void addDir(File dirObj, ZipOutputStream out) throws IOException { File[] files = dirObj.listFiles(); byte

下面是我试过的代码。它只压缩子文件夹的内容,而不压缩文件夹 我需要压缩所有子文件夹以及内容。我在这里做错了什么。 示例:我在demo文件夹中有一个文件夹“demo”,我有a、b、c文件夹。我想压缩a,b,c以及内容和压缩不应该包括家长是演示

static void addDir(File dirObj, ZipOutputStream out) throws IOException {
        File[] files = dirObj.listFiles();
        byte[] tmpBuf = new byte[1024];

        for (int i = 0; i < files.length; i++) {
          if (files[i].isDirectory()) {
            addDir(files[i], out);
            continue;
          }
          FileInputStream in = new FileInputStream(files[i].getAbsolutePath());
          System.out.println(" Adding: " + files[i].getName());
          out.putNextEntry(new ZipEntry(files[i].getName()));
          int len;
          while ((len = in.read(tmpBuf)) > 0) {
            out.write(tmpBuf, 0, len);
          }
          out.closeEntry();
          in.close();
        }
      }

    public static void zipFiles(File[] subd) {

        String zipFile = "test.zip";

        try {

            FileOutputStream fos = new FileOutputStream(zipFile);

            ZipOutputStream zos = new ZipOutputStream(fos);

            for (File dir : subd) {

                addDir(dir, zos);

            }

            // close the ZipOutputStream
            zos.close();

        } catch (IOException ioe) {
            System.out.println("Error creating zip file: " + ioe);
        }
static void addDir(文件dirObj,ZipOutputStream out)抛出IOException{
File[]files=dirObj.listFiles();
字节[]tmpBuf=新字节[1024];
对于(int i=0;i0){
out.write(tmpBuf,0,len);
}
out.closeEntry();
in.close();
}
}
公共静态void zipFiles(文件[]子文件){
字符串zipFile=“test.zip”;
试一试{
FileOutputStream fos=新的FileOutputStream(zipFile);
ZipoutStream zos=新ZipoutStream(fos);
for(文件目录:subd){
addDir(dir,zos);
}
//关闭ZipOutputStream
zos.close();
}捕获(ioe异常ioe){
System.out.println(“创建zip文件时出错:“+ioe”);
}

这是我为有层次结构和无层次结构的zip文件和目录编写的代码。
zip.getHierarchy().equals(“F”)
part完成您想要做的工作。 在这段代码中,必须将源文件、目标、层次结构(T/F)作为参数传递。 此外,您可能需要一个DTO类

public static void Start() throws IOException{ 

    FileOutputStream fos = new FileOutputStream(zip.getDestination());
    ZipOutputStream zipOut = new ZipOutputStream(fos);
    File fileToZip = new File(zip.getSourcePath());

        zipDirectory(fileToZip, fileToZip.getName(), zipOut);

    zipOut.close();
    fos.close();
}

public static void zipDirectory(File fileToZip, String fileName, ZipOutputStream zipOut) throws IOException {

    if (fileToZip.isDirectory()) {

        File[] children = fileToZip.listFiles();

        for (File childFile : children) {
            if(zip.getHierarchy().equals("T")) {
                zipDirectory(childFile, childFile.getPath(), zipOut);
            }else if(zip.getHierarchy().equals("F")){
                zipDirectory(childFile, childFile.getName(), zipOut);
            }
        }
        return; 
    }
    doZip(fileToZip,fileName,zipOut);
}

public static void doZip(File fileToZip,String fileName,ZipOutputStream zipOut) throws IOException {
    FileInputStream fis = new FileInputStream(fileToZip);
    ZipEntry zipEntry = new ZipEntry(fileName);
    zipOut.putNextEntry(zipEntry);
    byte[] bytes = new byte[1024];
    int length;
    while ((length = fis.read(bytes)) >= 0) {
        zipOut.write(bytes, 0, length);
    }
    fis.close();
}

可能类似于起点(
out.putnextery(新的ZipEntry(files[i].getName());
需要包含一个path元素,如链接示例所述)如果我添加路径,它会添加完整的obsolute path,我只需要zip中的所有子文件夹及其内容。我已经用示例解释了阅读链接的示例-它只添加相对路径(基于源路径)您是说这行字符串name=srcFile.getPath();name=name.replace(rootPath.getPath(),“”);这是基本想法的开始(只是一种方法)