Append a file into existing ZIP using Java

Need to modify a text file inside a ZIP without extracting the whole archive to disk? In this post, I’m going to show you how to do exactly that with a pure‑Java approach. The snippet opens in.zip, streams through its entries, and for the one named abc.txt it reads the content, replaces key1=value1 with key1=val2, appends a timestamp, and writes the updated bytes. Every other entry is copied byte‑for‑byte unchanged into a fresh out.zip. The logic relies on java.util.zip.ZipFile for reading and ZipOutputStream for writing, completely avoiding temporary files. I’ve also included a small helper isToString that converts an InputStream to a String via a ByteArrayOutputStream. One thing to keep in mind: the current implementation loads the file’s entire content into memory, so it’s perfect for small text files. If you’re dealing with larger data, a line‑by‑line streaming variant would be safer. Just drop this code into a ZipTests class, place in.zip next to it, and run it — you’ll get out.zip with your modifications ready to use.


import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.zip.ZipOutputStream;

public class ZipTests {

public static void main(String[] args) throws Exception {
var zipFile = new java.util.zip.ZipFile("in.zip");
final var zos = new ZipOutputStream(new FileOutputStream("out.zip"));
for (var e = zipFile.entries(); e.hasMoreElements(); ) {
var entryIn = e.nextElement();
System.out.println("Processing entry " + entryIn.getName());

// Set the next entry before writing any data to it
zos.putNextEntry(entryIn);

if (entryIn.getName().equalsIgnoreCase("abc.txt")) {
// Read existing content, replace a key, and append a timestamp

String content = isToString(zipFile.getInputStream(entryIn));
content = content.replaceAll("key1=value1", "key1=val2");
content += LocalDateTime.now() + "\r\n";

byte[] buf = content.getBytes();
zos.write(buf, 0, buf.length);
} else {
// For all other entries, stream the bytes unchanged
var inputStream = zipFile.getInputStream(entryIn);
byte[] buf = new byte[9096];
int len;
while ((len = inputStream.read(buf)) > 0) {
zos.write(buf, 0, len);
}

}
zos.closeEntry();
}
zos.close();
}

static String isToString(InputStream stringStream) throws Exception {
var result = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
for (int length; (length = stringStream.read(buffer)) != -1; ) {
result.write(buffer, 0, length);
}
return result.toString(StandardCharsets.UTF_8);
}

}

No comments :

Post a Comment

Your Comment and Question will help to make this blog better...