Languages/Kotlin

[Kotlin] Unzip a file with subfolder / subdirectory

반응형

문제

  1. 압축파일을 해제해야 한다 (.zip 파일)
  2. 하위 폴더가 존재하는 압축파일이다.

과정

엔트리의 상위 디렉토리 만들어주는 함수까지 파다가 다시 이럴리가 없다며 정신차리고 자바소스코드 보고서 긁어다 테스트하니까 바로 돌아갔다. 좀 허무... 그대로 쓰기엔 너무 자바스러워서 코틀린 소스로 재작성하였다.

인터넷에 있는 파일압축, 압축해제 예제들은 각기 다른 상태의 압축파일에 대한 예제이기 때문에 (단일 파일을 압축한 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

 

java - 폴더에있는 모든 Zip 파일을 읽고 모든 내용으로 새 텍스트 파일을 만드는 방법

하나의 zip 파일 만 읽을 수 있지만 폴더에있는 것은 아니며 아래 코드는 다음과 같습니다.이 기술을 사용하여 대부분의 파일을 읽습니다. 도와주세요 import java.awt.image.BufferedImage; import java.io.Buffe

www.python2.net

 

728x90
반응형