通过编辑文本内容读取并创建内存中复杂zip的副本

时间:2019-04-25 10:48:30

标签: java recursion zipoutputstream zipinputstream

我有一个使用嵌套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);

0 个答案:

没有答案