栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/496317.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号