Java : 하위 폴더가있는 폴더 압축 해제

InTheShell

파일을 하위 폴더로 추출하는 데 문제가 있습니다. 압축을 풀어야하는 zip 파일에는 여러 개의 폴더가 있으며 압축을 풀 때 디렉토리 구조를 유지하려고합니다.

package components;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

/**
 * This utility extracts files and directories of a standard zip file to
 * a destination directory.
 * 
 *
 */
public class UnzipUtility {
    /**
     * Size of the buffer to read/write data
     */
    private static final int BUFFER_SIZE = 4096;
    /**
     * Extracts a zip file specified by the zipFilePath to a directory specified by
     * destDirectory (will be created if does not exists)
     * @param zipFilePath
     * @param destDirectory
     * @throws IOException
     */
    public void unzip(String zipFilePath, String destDirectory) throws IOException {
        File destDir = new File(destDirectory);
        if (!destDir.exists()) {
            destDir.mkdir();
        }
        ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath));

        ZipEntry entry = zipIn.getNextEntry();
        // iterates over entries in the zip file
        while (entry != null) {
            String filePath = destDirectory + File.separator + entry.getName();
            if (!entry.isDirectory()) {
                // if the entry is a file, extracts it
                extractFile(zipIn, filePath);
                System.out.println(filePath);
            } else {
                // if the entry is a directory, make the directory
                File dir = new File(filePath);
                System.out.println(filePath);
                dir.mkdir();
            }
            zipIn.closeEntry();
            entry = zipIn.getNextEntry();
        }
        zipIn.close();
    }
    /**
     * Extracts a zip entry (file entry)
     * @param zipIn
     * @param filePath
     * @throws IOException
     */
    private void extractFile(ZipInputStream zipIn, String filePath) throws IOException {
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath));
        byte[] bytesIn = new byte[BUFFER_SIZE];
        int read = 0;
        while ((read = zipIn.read(bytesIn)) != -1) {
            bos.write(bytesIn, 0, read);
        }
        bos.close();
    }
}

코드에서 얻은 출력은 다음과 같습니다. 문제는 DoD-DISA-logos-as-JPEG.jpg 파일이 하위 폴더에 대한 하위 폴더의 일부라는 것입니다. 따라서 경로는 folder / subfolder / childfolder / DoD-DISA-logos-as-JPEG.jpg 여야합니다. 해당 하위 폴더를 포함하지 않으므로 내가 믿는 IO 예외가 발생합니다.

java.io.FileNotFoundException: /Users/user/Desktop/folder/subfolder/DoD-DISA-logos-as-JPEG.jpg (No such file or directory)
    at java.io.FileOutputStream.open0(Native Method)
    at java.io.FileOutputStream.open(FileOutputStream.java:270)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:101)
    at components.UnzipUtility.extractFile(UnzipUtility.java:62)
    at components.UnzipUtility.unzip(UnzipUtility.java:42)
    at components.UnzipUtilityTest.main(UnzipUtilityTest.java:9)
Nicolas Labrot

반복자가 모든 폴더 계층 구조를 나열 entry.isDirectory()한다는 사실에 의존해서는 안됩니다 ZipEntry.

zip 파일 구조는 ZipEntry이름에 하위 폴더 계층 구조를 포함 하는 파일 만 포함 할 수 있습니다 . 예 : foo/bar/file.txt있을 것입니다 ZipEntry하지만 foo/foo/bar/

따라서 :

  • 파일이없는 경우 상위 디렉토리를 가져 와서 전체 계층 구조를 만들어야합니다. File#mkdirs
  • 디렉토리가없는 경우 전체 계층 구조를 만들어야합니다. File#mkdirs

코드는 다음과 같이 변환되어야합니다.

       if (!entry.isDirectory()) {
            // if the entry is a file, extracts it
            new File(filePath).getParentFile().mkdirs();
            extractFile(zipIn, filePath);
            System.out.println(filePath);
        } else {
            // if the entry is a directory, make the directory
            File dir = new File(filePath);
            System.out.println(filePath);
            dir.mkdirs();
        }

외부 라이브러리를 사용하여 zt-zip 과 같은 압축 / 압축 해제를 권장합니다 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

최소 작업 공간으로 Java로 압축 해제 할 수 있도록이 폴더를 압축하는 가장 좋은 방법

분류에서Dev

Applescript를 사용하여 폴더 압축 및 압축 해제

분류에서Dev

폴더를 압축하고 .git 하위 폴더를 제외하는 방법

분류에서Dev

폴더를 압축하고 .git 하위 폴더를 제외하는 방법

분류에서Dev

Java로 폴더를 압축하지만 특정 하위 디렉터리는 제외

분류에서Dev

검색 결과 위치 폴더에 Windows 일괄 압축 해제

분류에서Dev

"압축 해제"가 미리 단일 폴더를 생성하는지 어떻게 알 수 있습니까?

분류에서Dev

압축을 해제하는 방법, de-tar -xvf-지저분한 폴더에서 압축 해제?

분류에서Dev

복사하는 동안 폴더 압축

분류에서Dev

폴더의 * .Z 파일을 압축 해제하면 오류가 반환됩니다.

분류에서Dev

폴더에서 * .Z 파일을 압축 해제하면 오류가 반환됩니다.

분류에서Dev

원본 폴더를 떠나지 않고 원본 폴더를 제거하지 않고 폴더를 압축하는 방법

분류에서Dev

tar -xvzf를 사용하여 압축을 해제하면 압축 파일보다 크기가 작은 폴더가 생성됩니다.

분류에서Dev

zip 파일을 폴더에 압축 해제하지만 중복 폴더를 피하는 방법은 무엇입니까?

분류에서Dev

루트 폴더 아래의 파이썬 압축 해제 파일

분류에서Dev

이전 폴더에 파일 압축 해제

분류에서Dev

새 파일을 덮어 쓰지 않고 폴더 압축 해제

분류에서Dev

tar.gz 내의 특정 폴더 압축 해제

분류에서Dev

Solaris에서 특정 폴더의 내용 압축 해제

분류에서Dev

아카이브를 단일 폴더로 압축 해제

분류에서Dev

폴더 내의 모든 하위 폴더를 개별 zip 파일로 압축

분류에서Dev

더 많은 하위 폴더 및 하위 폴더가 포함 된 폴더 삭제

분류에서Dev

폴더 내용을 압축하고 동일한 폴더에 Foldername으로 압축을 저장하는 방법

분류에서Dev

파일의 절대 경로에있는 폴더를 제외한 폴더의 파일 만 압축

분류에서Dev

WinRAR을 사용하여 압축 할 때 파일 및 폴더 제외

분류에서Dev

다른 폴더에있는 파일을 압축 할 때 폴더 무결성을 유지하는 방법

분류에서Dev

폴더가 압축되지 않았지만 폴더 안의 파일이 압축 된 위치를 재귀 적으로 추출하는 방법.

분류에서Dev

OpenCV Java를 사용하여 이미지를 압축하고 특정 폴더에 저장하는 방법

분류에서Dev

zipfile python을 사용하여 폴더를 압축하는 방법

Related 관련 기사

  1. 1

    최소 작업 공간으로 Java로 압축 해제 할 수 있도록이 폴더를 압축하는 가장 좋은 방법

  2. 2

    Applescript를 사용하여 폴더 압축 및 압축 해제

  3. 3

    폴더를 압축하고 .git 하위 폴더를 제외하는 방법

  4. 4

    폴더를 압축하고 .git 하위 폴더를 제외하는 방법

  5. 5

    Java로 폴더를 압축하지만 특정 하위 디렉터리는 제외

  6. 6

    검색 결과 위치 폴더에 Windows 일괄 압축 해제

  7. 7

    "압축 해제"가 미리 단일 폴더를 생성하는지 어떻게 알 수 있습니까?

  8. 8

    압축을 해제하는 방법, de-tar -xvf-지저분한 폴더에서 압축 해제?

  9. 9

    복사하는 동안 폴더 압축

  10. 10

    폴더의 * .Z 파일을 압축 해제하면 오류가 반환됩니다.

  11. 11

    폴더에서 * .Z 파일을 압축 해제하면 오류가 반환됩니다.

  12. 12

    원본 폴더를 떠나지 않고 원본 폴더를 제거하지 않고 폴더를 압축하는 방법

  13. 13

    tar -xvzf를 사용하여 압축을 해제하면 압축 파일보다 크기가 작은 폴더가 생성됩니다.

  14. 14

    zip 파일을 폴더에 압축 해제하지만 중복 폴더를 피하는 방법은 무엇입니까?

  15. 15

    루트 폴더 아래의 파이썬 압축 해제 파일

  16. 16

    이전 폴더에 파일 압축 해제

  17. 17

    새 파일을 덮어 쓰지 않고 폴더 압축 해제

  18. 18

    tar.gz 내의 특정 폴더 압축 해제

  19. 19

    Solaris에서 특정 폴더의 내용 압축 해제

  20. 20

    아카이브를 단일 폴더로 압축 해제

  21. 21

    폴더 내의 모든 하위 폴더를 개별 zip 파일로 압축

  22. 22

    더 많은 하위 폴더 및 하위 폴더가 포함 된 폴더 삭제

  23. 23

    폴더 내용을 압축하고 동일한 폴더에 Foldername으로 압축을 저장하는 방법

  24. 24

    파일의 절대 경로에있는 폴더를 제외한 폴더의 파일 만 압축

  25. 25

    WinRAR을 사용하여 압축 할 때 파일 및 폴더 제외

  26. 26

    다른 폴더에있는 파일을 압축 할 때 폴더 무결성을 유지하는 방법

  27. 27

    폴더가 압축되지 않았지만 폴더 안의 파일이 압축 된 위치를 재귀 적으로 추출하는 방법.

  28. 28

    OpenCV Java를 사용하여 이미지를 압축하고 특정 폴더에 저장하는 방법

  29. 29

    zipfile python을 사용하여 폴더를 압축하는 방법

뜨겁다태그

보관