코딩/JAVA

[JAVA] zip파일 압축 해제

yesman9 2023. 11. 15. 11:37

기상청 API를 이용해서 정보를 받아오는데 데이터가 zip파일로 되어있다.

보통 JSON, xml방식이 많은데 html로 주는 곳도 봤지만 zip파일은 또 처음이다...

심지어 zip파일 안의 폴더 안의 폴더 안의 폴더 안에있는 csv파일이 내가 원하는 정보이다.

즉, zip파일을 받아서, 압축을 풀고 경로를 검사해서, csv파일을 읽어야된다.

아래는 구현한 코드 일부분이다.


1. zip파일 다운로드

내 경우에는 다운로드 받을 파일명과 이미 다운로드받은 파일명이 동일한경우, 다운로드받지 않도록하는 로직을 구현했다. 그 부분은 생략하고, 파일명을 헤더에서 가져오는 부분만 아래 코드에 넣었다.

try {
    // API 서버 접속
    URL url = new URL(sb.toString());
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestMethod("GET");

    // "Content-Disposition" 헤더에서 파일 이름 가져오기
    String contentDisposition = connection.getHeaderField("Content-Disposition"); // contentDisposition 출력시: "attachment; filename=파일명"
    fileName = contentDisposition.split("=")[1]; // 따라서 split으로 파일명 잘라온다.

	// 파일명 비교, 다운로드 무효 처리
	//...생략...
   
    // zip파일 다운로드 및 저장
    InputStream in = url.openStream();
    OutputStream out = new FileOutputStream(zipFilePath + fileName);
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = in.read(buffer)) != -1) {
        out.write(buffer, 0, bytesRead);
    }
} catch (Exception e) {
    e.printStackTrace();
}
 
 

2. zip파일 압축 해제 및 csv파일 파싱

압축 해제를 하면서 동시에 csv파일을 파싱했다.

csv파일 파싱 부분은 라이브러리를 이용하면 더 쉽게할 수 있다.

하지만 난 라이브러리를 사용하기 싫어서 직접 구현했다.

// Zip 파일 압축해제
try {
    ZipInputStream zipIn = new ZipInputStream(new FileInputStream(zipFilePath + fileName));
    ZipEntry entry;
    while ((entry = zipIn.getNextEntry()) != null) {
        // csv파일명 검사
        if (entry.getName().contains(".csv")) {
            // csv파일 파싱
            try {
                BufferedReader br = new BufferedReader(new InputStreamReader(zipIn));
                String line;
                boolean skipFirstLine = true; // 첫 번째 줄을 건너뛰기 위한 플래그
                while ((line = br.readLine()) != null) {
                    if (skipFirstLine) { // 첫 번째 줄을 스킵
                        skipFirstLine = false;
                        continue;
                    }
                    String[] fields = line.split(",");
                    // fileds의 각 index를 JAVA 객체에 담아주는 작업
                    // ...생략...
                }
            } catch (Exception e) {
                // CSV파일 파싱 오류 처리
                // ...생략...
            }
        }
    }
} catch (Exception e) {
    // Zip파일 압축 해제 오류
    // ...생략...
}

 

의외로 쉽게 된것같다.