반응형
문제
- 압축파일을 해제해야 한다 (.zip 파일)
- 하위 폴더가 존재하는 압축파일이다.
과정
엔트리의 상위 디렉토리 만들어주는 함수까지 파다가 다시 이럴리가 없다며 정신차리고 자바소스코드 보고서 긁어다 테스트하니까 바로 돌아갔다. 좀 허무... 그대로 쓰기엔 너무 자바스러워서 코틀린 소스로 재작성하였다.
인터넷에 있는 파일압축, 압축해제 예제들은 각기 다른 상태의 압축파일에 대한 예제이기 때문에 (단일 파일을 압축한 zip파일, 파일들만 압축한 zip파일, zip파일을 재압축한 zip파일 등등...) 내가 필요한 예제를 잘 찾아내야 한다. 코틀린같은 경우에는 참고할 예제가 그리 많지 않아서 java 소스를 참고하여 재작성하였다.
결과
fun unZip(zipFilePath: String, targetPath: String) {
ZipFile(zipFilePath).use { zip ->
zip.entries().asSequence().forEach { entry -> //엔트리 각각에 대하여
logger.info("entry: {}, entry.name: {}", entry, entry.name)
val fileName = entry.name
val newFile = File(targetPath + File.separator + fileName)
// create all non exists folders
// else you will hit FileNotFoundException for compressed folder
File(newFile.parent).mkdirs()
zip.getInputStream(entry).use { input ->
File(targetPath, entry.name).outputStream().use { output ->
input.copyTo(output)
}
}
}
}
}
자바 -> 코틀린 컨버팅된 소스
fun unZip3(zipFilePath: String, targetPath: String) {
val buffer = ByteArray(1024)
try {
// create output directory is not exists
val folder = File(targetPath)
if (!folder.exists()) {
folder.mkdir()
}
// get the zip file content
val zis = ZipInputStream(FileInputStream(zipFilePath))
// get the zipped file list entry
var ze = zis.nextEntry
while (ze != null) {
val fileName = ze.name
val newFile = File(targetPath + File.separator.toString() + fileName)
// create all non exists folders
// else you will hit FileNotFoundException for compressed folder
File(newFile.parent).mkdirs()
val fos = FileOutputStream(newFile)
var len: Int
while (zis.read(buffer).also { len = it } > 0) {
fos.write(buffer, 0, len)
}
fos.close()
ze = zis.nextEntry
}
zis.closeEntry()
zis.close()
} catch (ex: IOException) {
logger().error("error!")
}
본래 참고한 자바 소스
public void unZipFile(File zipFile) {
byte[] buffer = new byte[1024];
try {
// create output directory is not exists
File folder = new File("PATH");
if (!folder.exists()) {
folder.mkdir();
}
// get the zip file content
ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile));
// get the zipped file list entry
ZipEntry ze = zis.getNextEntry();
while (ze != null) {
String fileName = ze.getName();
File newFile = new File("PATH" + File.separator + fileName);
if (_LOGGER.isDebugEnabled())
_LOGGER.debug("Unzipping file : {}", new Object[] {newFile.getAbsoluteFile()});
// create all non exists folders
// else you will hit FileNotFoundException for compressed folder
new File(newFile.getParent()).mkdirs();
FileOutputStream fos = new FileOutputStream(newFile);
int len;
while ((len = zis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.close();
ze = zis.getNextEntry();
}
zis.closeEntry();
zis.close();
} catch(IOException ex) {
_LOGGER.error("Exception occurred while unzipping!", ex);
}
}
출처: https://www.python2.net/questions-171480.htm
728x90
반응형
'Languages > Kotlin' 카테고리의 다른 글
[Kotlin] Content is not allowed in prolog.; HTTP header setting error (0) | 2021.06.08 |
---|---|
[Kotlin] Open API 호출해서 데이터 가져오기 (0) | 2021.05.31 |