코딩/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파일 압축 해제 오류
// ...생략...
}
의외로 쉽게 된것같다.