使用Java修改ZIP存档中的文本文件
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用Java修改ZIP存档中的文本文件,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2243字,纯文字阅读大概需要4分钟。
内容图文
![使用Java修改ZIP存档中的文本文件](/upload/InfoBanner/zyjiaocheng/709/267fdd5f84444a89a8042bbd5dac5b32.jpg)
我的用例要求我打开一个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存档中的文本文件全部内容,希望文章能够帮你解决使用Java修改ZIP存档中的文本文件所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。