在Java中的ZIP存档中修改文本文件

我的用例要求我打开一个txt文件,例如abc.txt,该文件位于zip归档文件中,该归档文件包含以下格式的键值对:

key1 = value1

key2 = value2

..依此类推,每个键值对都位于新行中。我必须更改与某个键对应的一个值,然后将文本文件放回存档的新副本中。如何在Java中执行此操作?

到目前为止,我的尝试:

    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{

// I'm not sure what to do here

// Tried a few things and the file gets corrupt

}

zos.closeEntry();

}

zos.close();

回答:

您几乎完全正确。一种可能的原因,该文件显示为已损坏,是您可能已使用过

zos.putNextEntry(entryIn)

在其他部分也是如此。这将在zip文件中创建一个新条目,其中包含来自现有zip文件的信息。现有信息包含条目名称(文件名)及其CRC等信息。

然后,当您尝试更新文本文件并关闭zip文件时,由于条目中定义的CRC与您尝试写入的对象的CRC不同,它将引发错误。

另外,如果您要替换的文本的长度与现有文本的长度不同(即您要替换的文本),则可能会出错

key1 = value1

key1 = 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.length

以上是 在Java中的ZIP存档中修改文本文件 的全部内容, 来源链接: utcz.com/qa/427616.html

回到顶部