我想更新位于zipfile内的文本文件的内容.
我无法找到如何执行此操作,以下代码无法正常工作.
谢谢你的帮助!!
import java.util.zip.ZipFile import java.util.zip.ZipEntry import java.util.zip.ZipOutputStream String zipFileFullPath = "C:/path/to/myzipfile/test.zip" ZipFile zipFile = new ZipFile(zipFileFullPath) ZipEntry entry = zipFile.getEntry ( "someFile.txt" ) if(entry){ InputStream input = zipFile.getInputStream(entry) BufferedReader br = new BufferedReader(new InputStreamReader(input,"UTF-8")) String s = null StringBuffer sb = new StringBuffer() while ((s=br.readLine())!=null){ sb.append(s) } sb.append("adding some text..") ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileFullPath)) out.putNextEntry(new ZipEntry("someFile.txt")); int length InputStream fin = new ByteArrayInputStream(sb.toString().getBytes("UTF8")) while((length = fin.read(sb)) > 0) { out.write(sb,length) } out.closeEntry() }
解决方法
只是对@Opal的答案进行了一些细微的修改,我只是:
Groovy Snippet
void updateZipEntry(String zipFile,String zipEntry,String newContent){ def zin = new ZipFile(zipFile) def tmp = File.createTempFile("temp_${System.nanoTime()}",'.zip') tmp.withOutputStream { os -> def zos = new ZipOutputStream(os) zin.entries().each { entry -> def isReplaced = entry.name == zipEntry zos.putNextEntry(isReplaced ? new ZipEntry(zipEntry) : entry) zos << (isReplaced ? newContent.getBytes('UTF8') : zin.getInputStream(entry).bytes ) zos.closeEntry() } zos.close() } zin.close() assert new File(zipFile).delete() tmp.renameTo(zipFile) }
updateZipEntry('/tmp/file.zip','Meta-INF/web.xml','<foobar>new content!</foobar>')