使用Java压缩目录时获取奇怪的结构文件

时间:2016-04-26 04:35:25

标签: java zipfile

我想在其中压缩包含文件和子目录的目录。我做到了这一点并且工作得很好,但我得到了不寻常和好奇的文件结构(至少我是这样看的。)

这是创建的文件:Empty zip file当我点击它时,我看到一个"空"像这样的目录:enter image description here但是当我解压缩这个时,我看到了这个文件结构(并不是所有的名字都是如图所示,如下图所示):

 |mantenimiento
   |Carpeta_A
     |File1.txt
     |File2.txt
   |Carpeta_B
     |Sub_carpetaB
       |SubfileB.txt
     |Subfile1B.txt
     |Subfile2B.txt
   |File12.txt

我的问题不知何故是文件夹" mantenimiento"是我从哪里拉(我想要压缩的目录),我不希望它在那里,所以当我解压缩刚刚创建的.zip文件时,我希望它具有这种文件结构(这是文件和目录里面的& #34; mantenimiento"目录):Correct directory structure,另一件事是当我点击.zip文件时,我想看到文件和目录,就像上面显示的图像一样。

我不知道我的代码有什么问题,我已经搜索了但是没有找到我的问题的参考。

这是我的代码:

private void zipFiles( List<File> files, String directory) throws IOException
{
    ZipOutputStream zos = null;
    ZipEntry zipEntry = null;
    FileInputStream fin = null;
    FileOutputStream fos = null;
    BufferedInputStream  in = null;

    String zipFileName = getZipFileName();

    try
    {
        fos = new FileOutputStream( File.separatorChar + zipFileName + EXTENSION );

        zos = new ZipOutputStream(fos);

        byte[] buf = new byte[1024];

        int len;

        for(File file : files)
        {
            zipEntry = new ZipEntry(file.toString());
            fin = new FileInputStream(file);
            in = new BufferedInputStream(fin);
            zos.putNextEntry(zipEntry);
            while ((len = in.read(buf)) >= 0)
            {
                zos.write(buf, 0, len);
            }
        }
    }
    catch(Exception e)
    {
        System.err.println("No fue posible zipear los archivos");
        e.printStackTrace();
    }
    finally
    {
        in.close();
        zos.closeEntry();
        zos.close();
    }

}

希望你们能给我一些关于我做错了什么或者我错过了什么的提示。

非常感谢。

顺便说一句,我从未使用过该方法的目录。我给出的另一个参数是一个文件列表,其中包含C:\ mantenimiento目录中的所有文件和目录。

1 个答案:

答案 0 :(得分:0)

我曾经遇到过windows和zip文件的问题,其中创建的zip不包含文件夹的条目(即//Carpeta_A等)仅文件条目。尝试为没有流媒体内容的文件夹添加ZipEntries。

但是作为Java的有点笨重的Zip API的替代品,您可以使用Filesystem(自Java7起)。以下示例适用于Java8(lambda):

//Path pathToZip = Paths.get("path/to/your/folder");
//Path zipFile = Paths.get("file.zip");

public Path zipPath(Path pathToZip, Path zipFile) {
    Map<String, String> env = new HashMap<String, String>() {{
        put("create", "true");
    }};

    try (FileSystem zipFs = FileSystems.newFileSystem(URI.create("jar:" + zipFile.toUri()), env)) {
        Path root = zipFs.getPath("/");
        Files.walk(pathToZip).forEach(path -> zip(root, path));
    }
}

private static void zip(final Path zipRoot, final Path currentPath) {

    Path entryPath = zipRoot.resolve(currentPath.toString());
    try {
        Files.createDirectories(entryPath.getParent());
        Files.copy(currentPath, entryPath);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }

}