code: public ISynchronizationPoint<IOException> finishAsync() {
  		if (finishing != null) return finishing;
  		finishing = new SynchronizationPoint<>();
  		Task<Void,NoException> task = new Task.Cpu<Void,NoException>("Finishing zip compression", priority) {
  			@Override
  			public Void run() {
  				AsyncWork<Integer, IOException> lastWrite = null;
  				deflater.finish();
  				if (!deflater.finished()) {
  					do {
  						byte[] writeBuf = new byte[8192];
  						int nb = deflater.deflate(writeBuf, 0, writeBuf.length);
  						if (nb <= 0) break;
  						try { lastWrite = writeOps.write(ByteBuffer.wrap(writeBuf, 0, nb)); }
  						catch (IOException e) {
  							finishing.error(e);
  							return null;
  						}
  					} while (!deflater.finished());
  				}
  				if (lastWrite == null) lastWrite = writeOps.getLastPendingOperation();
  				if (lastWrite != null)
  					lastWrite.listenInline(finishing);
  				else
  					finishing.unblock();
  				return null;
  			}
  		};
  		task.start();
  		return operation(finishing);
  	}
docs: Indicates that no more data will be compressed and flushes remaining compressed data to the output.