Thanks for pointing out that bug it may help someone else in the future.
To improve that code further wherever streams are used they should be wrapped in a try-catch clause with the close() done in a finally clause to ensure it is always called.
BTW In your code, zos.close() could throw an exception which would mean zip.close() was never called.
Oh (beeep)! You are of course right, and no, you assumed wrong! But I've fixed it and it now it looks like this:
I let all IOExceptions be thrown uppward where they eventually will be handled and logged. I don't think it is a good idea to swallow them on failed close() just because you are done for the moment since if this happens there is obvously something wrong.
One interesting (and non relevant :-)) question here is if both close() statements throw an IOException, which will be delivered ? I guess the second one.