Question

I would like to create a zip file with Commons VFS2 library. I know how to copy a file when using file prefix but for zip files write and read are not implemented.

fileSystemManager.resolveFile("path comes here")-method fails when I try path zip:/some/file.zip when file.zip is an non-existing zip-file. I can resolve an existing file but non-existing new file fails.

So how to create that new zip file then? I cannot use createFile() because it is not supported and I cannot create the FileObject before this is to be called.

The normal way is to create FileObject with that resolveFile and then call createFile for the object.

Was it helpful?

Solution

The answer to my need is the following code snippet:

// Create access to zip.
FileSystemManager fsManager = VFS.getManager();
FileObject zipFile = fsManager.resolveFile("file:/path/to/the/file.zip");
zipFile.createFile();
ZipOutputStream zos = new ZipOutputStream(zipFile.getContent().getOutputStream());

// add entry/-ies.
ZipEntry zipEntry = new ZipEntry("name_inside_zip");
FileObject entryFile = fsManager.resolveFile("file:/path/to/the/sourcefile.txt");
InputStream is = entryFile.getContent().getInputStream();

// Write to zip.
byte[] buf = new byte[1024];
zos.putNextEntry(zipEntry);
for (int readNum; (readNum = is.read(buf)) != -1;) {
   zos.write(buf, 0, readNum);
}

After this you need to close the streams and it works!

OTHER TIPS

In fact, it is possible to create zip files uniquely from Commons-VFS by using the following idio :

        destinationFile = fileSystemManager.resolveFile(zipFileName);
        // destination is created as a folder, as the inner content of the zip
        // is, in fact, a "virtual" folder
        destinationFile.createFolder();

        // then add files to that "folder" (which is in fact a file)

        // and finally close that folder to have a usable zip
        destinationFile.close();

        // Exception handling is left at user discretion
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top