将带有递归子目录的zip文件转换为对象

时间:2018-09-23 17:09:28

标签: java stream inputstream

我需要阅读一个zip文件并将其内容转换为Bundle对象。 SUB_BUNDLE目录是递归的。

文件内容:

file1.json
file2.xml
file3.xml
SUB_BUNDLE/w2/file4.json
SUB_BUNDLE/w2/file5.json
SUB_BUNDLE/w2/PDF_TEMPLATE/
SUB_BUNDLE/w2/PDF_TEMPLATE/file6.pdf
SUB_BUNDLE/w3/file7.json
SUB_BUNDLE/w3/file8.json
SUB_BUNDLE/w3/SUB_BUNDLE/w4/file9.json
SUB_BUNDLE/w3/SUB_BUNDLE/w4/file10.json
SUB_BUNDLE/w5/file11.json
PDF_TEMPLATE/file12.pdf

我尝试像这样从上面的目录数据创建一个Bundle对象:

files: [ 'file1.json', 'file2.xml', 'file3.xml' ],
pdfTemplates: [ 'file12.pdf' ],
subBundles: [
    w2: {
        files: [ 'file4.json', 'file5.json' ],
        subBundles: [ ],
        pdfTemplates: [ 'file6.pdf' ]
    }
    w3: {
        files: [ 'file7.json', 'file8.json' ],
        pdfTemplates: [ ],
        subBundles: [
            w4: {
                files: [ 'file9.json', 'file10.json' ],
                subBundles: [ ],
                pdfTemplates: [ ]
            }
         ]
    }
    w5: {
        files: [ 'file11.json' ],
        subBundles: [ ],
        pdfTemplates: [ ]
    }
]

Bundle类

public class Bundle () {
    protected List<Bundle> files = new ArrayList();
    protected List<Bundle> pdfTemplates = new ArrayList();
    protected List<Bundle> subBundles = new ArrayList();

    public Bundle () { }

    public void addSubBundle(Bundle bundle) {
        subBundles.add(bundle);
    }
    public void addPdfTemplate(String pdfTemplate) {
        pdfTemplates.add(pdfTemplate);
    }
    public void addFile(String file) {
        files.add(file);
    }
}

我尝试了很多事情,但这是我的起点,它将如上所述返回Bundle对象:

public Bundle unpack(InputStream inputStream, Bundle bundle) throws IOException {
    ZipInputStream zipInputStream = new ZipInputStream(inputStream);
    ZipEntry entry;

    while ((entry = zipInputStream.getNextEntry()) != null) {
        final String entryName = entry.getName();

        if (entry.isDirectory()) {
            final String[] parts = entryName.split("/");
            final String folder = parts[parts.length - 1];

            if(folder.equlas("PDF_TEMPLATE")) {
                bundle.addPdfTemplate(entryName);
            } else {
                Bundle newBundle = new Bundle();
                // fill this new bundle's file,pdfTepmlates and subBundles and then add into its parent as subSubdle
                bundle.addSubBundle(newBundle);
            }

        } else {
            bundle.addFile(entryName);
        }
    }

    return bundle;
}

我知道我需要在某个地方递归循环,但我无法做到这一点。你能帮我吗?

0 个答案:

没有答案