Zip-файлы на основе InputStreams - PullRequest
       15

Zip-файлы на основе InputStreams

0 голосов
/ 07 сентября 2011

У меня есть способ архивировать файлы в Java:

public void compress(File[] inputFiles, OutputStream outputStream) {

    Validate.notNull(inputFiles, "Input files are required");
    Validate.notNull(outputStream, "Output stream is required");

    int BUFFER = 2048;

    BufferedInputStream origin = null;

    ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(outputStream));
    byte data[] = new byte[BUFFER];

    for (File f : inputFiles) {
        FileInputStream fi;
        try {
            fi = new FileInputStream(f);
        } catch (FileNotFoundException e) {
            throw new RuntimeException("Input file not found", e);
        }
        origin = new BufferedInputStream(fi, BUFFER);
        ZipEntry entry = new ZipEntry(f.getName());
        try {
            out.putNextEntry(entry);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        int count;
        try {
            while ((count = origin.read(data, 0, BUFFER)) != -1) {
                out.write(data, 0, count);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        try {
            origin.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    try {
        out.close();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

Как видите, параметр inputFiles - это массив объектов File. Это все работает, но я бы хотел иметь вместо этого коллекцию объектов InputStream в качестве параметра, чтобы сделать его более гибким.

Но тогда у меня проблема в том, что при создании нового ZipEntry (как в коде выше)

ZipEntry entry = new ZipEntry(f.getName());

У меня нет имени файла в качестве параметра.

Как мне решить это? Может быть, карта с парами (fileName, inputStream)?

Любые мысли по этому поводу приветствуются!

Спасибо, Nathan

Ответы [ 2 ]

1 голос
/ 07 сентября 2011

Я думаю, что карта хорошая.Просто обратите внимание на тип используемой вами карты, если вы хотите сохранить исходный порядок файлов в вашем ZIP.В этом случае используйте LinkedHashMap.

1 голос
/ 07 сентября 2011

Я думаю, ваше предложение Map<String, InputStream> является хорошим решением.

Просто примечание: Не забудьте закрыть входные потоки после того, как вы закончите


Если вы хотите сделать его более «модным» , вы всегда можете использовать create interface:

interface ZipOuputInterface {
    String getName();
    InputStream getInputStream();
}

И реализовать это по-разному в разных случаях, например File:

class FileZipOutputInterface implements ZipOutputInterface {

    File file;

    public FileZipOutputInterface(File file) {
        this.file = file;
    }

    public String getName() {
        return file.getAbstractName();
    }
    public InputStream getInputStream() {
        return new FileInputStream(file);
    }
}
...