У меня есть метод рекурсии для открытого 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();
}
}
Метод для простого почтового индекса:
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);