scalazip

How do I archive multiple files into a .zip file using scala?


Could anyone post a simple snippet that does this?

Files are text files, so compression would be nice rather than just archive the files.

I have the filenames stored in an iterable.


Solution

  • There's not currently any way to do this kind of thing from the standard Scala library, but it's pretty easy to use java.util.zip:

    def zip(out: String, files: Iterable[String]) = {
      import java.io.{ BufferedInputStream, FileInputStream, FileOutputStream }
      import java.util.zip.{ ZipEntry, ZipOutputStream }
    
      val zip = new ZipOutputStream(new FileOutputStream(out))
    
      files.foreach { name =>
        zip.putNextEntry(new ZipEntry(name))
        val in = new BufferedInputStream(new FileInputStream(name))
        var b = in.read()
        while (b > -1) {
          zip.write(b)
          b = in.read()
        }
        in.close()
        zip.closeEntry()
      }
      zip.close()
    }
    

    I'm focusing on simplicity instead of efficiency here (no error checking and reading and writing one byte at a time isn't ideal), but it works, and can very easily be improved.