Skip to content

Commit 5160e31

Browse files
[KTLN-865] Create a Zip file in Kotlin (#941)
* unit tests added * code fixes * Update core-kotlin-modules/core-kotlin-files/src/test/kotlin/com/baeldung/createZip/CreateZipFileUnitTest.kt --------- Co-authored-by: Brandon Ward <[email protected]>
1 parent c4e8b55 commit 5160e31

File tree

2 files changed

+109
-0
lines changed

2 files changed

+109
-0
lines changed

core-kotlin-modules/core-kotlin-files/pom.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,19 @@
1313
<version>1.0.0-SNAPSHOT</version>
1414
</parent>
1515

16+
<dependencies>
17+
<dependency>
18+
<groupId>org.apache.commons</groupId>
19+
<artifactId>commons-compress</artifactId>
20+
<version>1.21</version>
21+
</dependency>
22+
23+
<dependency>
24+
<groupId>net.lingala.zip4j</groupId>
25+
<artifactId>zip4j</artifactId>
26+
<version>2.8.0</version>
27+
</dependency>
28+
29+
</dependencies>
30+
1631
</project>
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package com.baeldung.createZip
2+
3+
import net.lingala.zip4j.ZipFile
4+
import net.lingala.zip4j.model.ZipParameters
5+
import net.lingala.zip4j.model.enums.CompressionLevel
6+
import net.lingala.zip4j.model.enums.CompressionMethod
7+
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry
8+
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream
9+
import org.apache.commons.compress.utils.IOUtils
10+
import org.junit.jupiter.api.Assertions.assertTrue
11+
import org.junit.jupiter.api.Test
12+
import java.io.File
13+
import java.io.FileInputStream
14+
import java.io.FileOutputStream
15+
import java.util.zip.ZipEntry
16+
import java.util.zip.ZipOutputStream
17+
18+
class CreateZipFileUnitTest {
19+
20+
val filesToZip = listOf(File("file1.txt").apply { writeText("Hello, World!") }, File("file2.txt").apply { writeText("Kotlin ZIP Test") })
21+
22+
@Test
23+
fun `create zip file with java standard library`() {
24+
val outputZipFile = File("test_output.zip")
25+
26+
createZipFile(filesToZip, outputZipFile)
27+
28+
assertTrue(outputZipFile.exists())
29+
assertTrue(outputZipFile.length() > 0)
30+
31+
filesToZip.forEach { it.delete() }
32+
outputZipFile.delete()
33+
}
34+
35+
@Test
36+
fun `create zip file with apache commons compress`() {
37+
val outputZipFile = File("test_output_with_apache.zip")
38+
39+
createZipFileWithApache(filesToZip, outputZipFile)
40+
41+
assertTrue(outputZipFile.exists())
42+
assertTrue(outputZipFile.length() > 0)
43+
44+
// Clean up
45+
filesToZip.forEach { it.delete() }
46+
outputZipFile.delete()
47+
}
48+
49+
@Test
50+
fun `create zip file with Zip4j library`() {
51+
val outputZipFile = File("test_output_with_zip4j.zip")
52+
53+
createZipFileWithZip4j(filesToZip, outputZipFile)
54+
55+
assertTrue(outputZipFile.exists())
56+
assertTrue(outputZipFile.length() > 0)
57+
58+
filesToZip.forEach { it.delete() }
59+
outputZipFile.delete()
60+
}
61+
}
62+
fun createZipFile(files: List<File>, outputZipFile: File) {
63+
ZipOutputStream(FileOutputStream(outputZipFile)).use { zipOut ->
64+
files.forEach { file ->
65+
FileInputStream(file).use { fis ->
66+
val zipEntry = ZipEntry(file.name)
67+
zipOut.putNextEntry(zipEntry)
68+
fis.copyTo(zipOut)
69+
zipOut.closeEntry()
70+
}
71+
}
72+
}
73+
}
74+
75+
fun createZipFileWithApache(files: List<File>, outputZipFile: File) {
76+
ZipArchiveOutputStream(FileOutputStream(outputZipFile)).use { zipOut ->
77+
files.forEach { file ->
78+
zipOut.putArchiveEntry(ZipArchiveEntry(file.name))
79+
FileInputStream(file).use { fis ->
80+
IOUtils.copy(fis, zipOut)
81+
}
82+
zipOut.closeArchiveEntry()
83+
}
84+
}
85+
}
86+
87+
fun createZipFileWithZip4j(files: List<File>, outputZipFile: File) {
88+
val zipFile = ZipFile(outputZipFile)
89+
val parameters = ZipParameters().apply {
90+
compressionMethod = CompressionMethod.DEFLATE
91+
compressionLevel = CompressionLevel.NORMAL
92+
}
93+
zipFile.addFiles(files, parameters)
94+
}

0 commit comments

Comments
 (0)