I have a zip archive with a lot of files(other zip files, text files, gz archives) inside it. Need to create a new zip file with the same structure. Some info in the new zip must be changed. For example, need to change all 'a' letters in all files to the letter 'b'. Need to resolve the task without creating temp files or unpacking archives to the temp folders. How can I do it?
If you need to do this entirely streaming, you will need to parse the zip file format, copy entries that are not being modified to a new zip file, and process entries that are being modified by decompressing them and recompressing them in streams, copying to the new zip file.
If you don't need to do this streaming, then extract the entries you want to modify, removing them from the zip file. Modify them. Then add them to the zip file using any zip utility.
Related
I'm trying to generate a zip file with java.util.zip API and I haven't found any way to set zip entry as read only file. I would like to create a new ZIP archive, put files inside it and set read only flag for all those files that appear inside of the ZIP file (on Windows platform).
I am aware that java.util.zip API works with Streams instead of File objects (File object has method setReadonly()).
I also tried with Apache Commons Compress API and haven't found solution as well.
Please help!
I am creating a zip file using ZipOutputStream. There will also be a manifest file (a csv file) which will have links to the entries in the Zip file. How do I programmatically create links for the zip entries ?
If you keep track of all the entries while you write them, you should be able to add another entry containing the "links" (but how should a csv link to a file? Please specify what you try to achieve).
If you intend to use the file under windows, you could create .lnk files programmatically; but this only works for one file per link. On unices, ZipOutputStream cannot create symlinks, but ZipFileSystem can.
How can I add/modify/delete/merge recursive directory in a zip file (in Java) without file system?
Do I have to respect the order of zip entries?
Yes, I know merging directories is very complex job..
If you need to add whole directory with files to zip archive recursively only by Java core efforts, then you can use good example from Mkyong's blog. If you need to append files to existing zip-file, the you should use a link from #McDowell's comment: Appending files to a zip file with Java
There is no simple answer, your going to need to write a faire bit of code. You can't use the JDK ZipFile class, as that only supports reading zip files.
Instead use Commons Compress. Have a look at the examples and the zip documentation to get going.
Basically you'll need to open an input zip file, and an output zip file. Read each entry in tern, and decide whether to write it to the output, transform and write, add a new entry, or skip it, . When you get to the end close both zip files.
When processing a zip file, it's not really recursive, as all the entries are just a linear list with a path and filename. The recursive part comes when a zip contains a zip, and that is quite easy to handle.
Referring to this post I have zipped and unzipped folders successfully - TrueZip - How to decompress inner jar/zip files without expanding them as directories?
Is there any way to split zip into parts using truezip, similar to 7z which allows us to create parts of zip file?
No, ZIP file splitting/spanning is not supported by TrueZIP.
I have a folder containing a large number of .zip files. I would like to enlist
those file and recursively read the compressed .xml files. How would i first enlist those .zip files?I didn't get any idea at all.
create a File object for your directory and call its listFilesmethod with an appropriate filter for your zip Files.
Construct a ZipFile object for every zipfile and call its entries() method to get a list of entries. Find the ZipEntry of the sought XML file and call ZipFile.getInputstream(xmlZipFileEntry) to start reading its content.