JAVA - SPRING

[Java] 압축파일 내부 개별파일 크기 확인하기 | java zipentry getSize() -1 return 이유

엘라 ELLA 2024. 11. 20. 19:42
728x90
반응형

SPEC

Spring boot version 2.6.2
Java 1.8 -> RestTemplate을 이용한 API 통신을 위한 프로젝트

 

예시 코드

ZIP 파일 내부 개별의 파일들을 확인하며 해당 파일들의 이름 / 파일 크기를 출력하는 예시 코드는 다음과 같습니다.

 

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-compress -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-compress</artifactId>
    <version>1.27.1</version>
</dependency>



import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipFile;

import java.io.File;
import java.io.IOException;
import java.util.Enumeration;

public class ApacheCommonsCompressExample {
    public static void main(String[] args) {
        // ZIP 파일 경로
        File zipFile = new File("example.zip");

        try (ZipFile zip = new ZipFile(zipFile)) {
            Enumeration<ZipArchiveEntry> entries = zip.getEntries();

            // 엔트리를 순회하며 정보 출력
            while (entries.hasMoreElements()) {
                ZipArchiveEntry entry = entries.nextElement();
                System.out.println("File: " + entry.getName());
                System.out.println("Size: " + entry.getSize()); // 압축 해제된 크기
                System.out.println("Compressed Size: " + entry.getCompressedSize()); // 압축된 크기
                System.out.println("Is Directory: " + entry.isDirectory());
                System.out.println("-----");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 

문제

위의 코드와 유사한 프로젝트 개발 방향에 맞게 코드를 수정해서 사용중이었습니다.

그런데 파일 크기중 return 값에 -1이 나오는것을 발견했습니다.

원인

zip 파일 내부의 파일명에 공백(" ")이 존재.

자세히 확인 해 보면 00-46  다음 공백 이후 다음 이름이 있습니다.

해결

해당 파일의 이름을 수정해 공백을 없앤 뒤 출력 해 보니 정상적으로 파일 크기가 잡히는것을 확인 할 수 있었습니다.

zipEntry의 경우 불가항력적으로 원인미상의 -1을 return 할 때도 있다고는 합니다.

 

제가 확인한 바로는 각 개별 파일에 공백이 존재하는 경우에도 getSize()를 했을 때 -1을 return 했으니 이부분을 확인 해 보시면 좋겠네요.

 

반응형