你几乎是正确的。一个可能的原因,该文件显示为损坏的是,你可能已经使用
zos.putNextEntry(entryIn) 在其他部分
为好。这会在包含来自现有zip文件的信息的zip文件中创建一个新条目。现有信息包含条目名称(文件名称)及其CRC等。
然后,当您尝试更新文本文件并关闭zip文件时,它将引发错误,因为条目中定义的CRC和您尝试写入的对象的CRC不同。
此外,如果你正在试图取代文本的长度是一个比现有的即你正在试图取代
key1的不同ü可能得到错误=值
与
键1 = VAL1
这可以归结为您尝试写入的缓冲区长度与指定的缓冲区长度不同的问题。
ZipFile zipFile = new ZipFile("test.zip");
final ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("out.zip"));
for(Enumeration e = zipFile.entries(); e.hasMoreElements();) {
ZipEntry entryIn = (ZipEntry) e.nextElement();
if (!entryIn.getName().equalsIgnoreCase("abc.txt")) {
zos.putNextEntry(entryIn);
InputStream is = zipFile.getInputStream(entryIn);
byte[] buf = new byte[1024];
int len;
while((len = is.read(buf)) > 0) {
zos.write(buf, 0, len);
}
}
else{
zos.putNextEntry(new ZipEntry("abc.txt"));
InputStream is = zipFile.getInputStream(entryIn);
byte[] buf = new byte[1024];
int len;
while ((len = (is.read(buf))) > 0) {
String s = new String(buf);
if (s.contains("key1=value1")) {
buf = s.replaceAll("key1=value1", "key1=val2").getBytes();
}
zos.write(buf, 0, (len < buf.length) ? len : buf.length);
}
}
zos.closeEntry();
}
zos.close();
以下代码确保即使被替换的数据是比原来的长度的长度以下,不会发生IndexOutOfBoundsExceptions。
(len < buf.length)? len:buf。长度