我有一个使用嵌套zip的开放zip的递归方法。 我有一种方法可以复制和修改简单的zip(zip文件仅包含一个文本文件)。 修改为:用>替换(用<和)。 但是我必须处理嵌套的zip文件-里面有另一个zip条目。
我需要在递归方法中添加写入输出文件的功能(用于嵌套zip-彼此之间几乎没有zip条目)并即时修改其文本文件。
最终zip应该是输入zip的副本,但是要替换一些文本内容。
谢谢你。
递归地打开嵌套zip的方法:
public static void processZip(final InputStream inStream) {
ZipInputStream input = new ZipInputStream(inStream);
ZipEntry entry = null;
try {
while ((entry = input.getNextEntry()) != null) {
System.out.println(" " + entry.getName());
if (entry.getName().endsWith(".zip")) {
processZip(input);
}
// if it is a file which ends with .txt or without any extension
if ((entry.getName().endsWith(".txt")
|| !entry.getName().matches(".*\\.(\\w*)"))
&& !entry.isDirectory()) {
BufferedReader reader =
new BufferedReader(new InputStreamReader(input));
System.out.println(" text");
}
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
简单zip的方法:
public static void copyAndModifyZip(ZipFile inZipFile, ZipOutputStream zos) throws IOException {
Enumeration entries = inZipFile.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = (ZipEntry)entries.nextElement();
System.out.println(entry.getName());
if // file *.txt or with no extension
((entry.getName().endsWith(".txt")
|| !entry.getName().matches(".*\\.(\\w*)"))
&& !entry.isDirectory()) {
System.out.println(" text");
}
ZipEntry newEntry = new ZipEntry(entry.getName());
zos.putNextEntry(newEntry);
InputStream inStream = inZipFile.getInputStream(entry);
Reader reader = new InputStreamReader(inStream);
BufferedReader bufReader = new BufferedReader(reader);
try {
String line = bufReader.readLine();
String lineOut;
while (line != null) {
lineOut = (line.replace(")",">")).replace("(","<") + "\n";
zos.write(lineOut.getBytes(Charset.forName("UTF-8")));
line = bufReader.readLine();
} // while
zos.write("checked".getBytes(Charset.forName("UTF-8")));
} catch (IOException ex) {
ex.printStackTrace();
}
inStream.close();
zos.closeEntry();
}
zos.close();
}
如何调用这两种方法:
String dir = "C:\\Temp";
String inFileName = dir + "\\in.zip";
String outFileName = dir + "\\out.zip";
File inputZipFile = new File(inFileName);
FileInputStream input = new FileInputStream(inputZipFile);
processZip(input/*, inputZipFile.toString()*/);
System.out.println("-------");
ZipFile inZipFile = new ZipFile(inFileName);
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(outFileName));
copyAndModifyZip(inZipFile, zos);