Прочитайте и создайте копию сложного почтового индекса в памяти с редактированием текстового содержания - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть метод рекурсии для открытого 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);
...