Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

scala

zipfile

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.

like image 247
Pico Avatar asked Apr 03 '12 00:04

Pico


2 Answers

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.

like image 159
Travis Brown Avatar answered Sep 28 '22 18:09

Travis Brown


I recently had to work with zip files too and found this very nice utility: https://github.com/zeroturnaround/zt-zip

Here's an example of zipping all files inside a directory:

import org.zeroturnaround.zip.ZipUtil
ZipUtil.pack(new File("/tmp/demo"), new File("/tmp/demo.zip"))

Very convenient.

like image 37
Gabriele Petronella Avatar answered Sep 28 '22 16:09

Gabriele Petronella