Как прочитать содержимое заархивированного файла без извлечения в java

У меня есть файл с такими именами, как ex.zip. В этом примере Zip-файл содержит только один файл с таким же именем (например, `ex.txt'), который довольно велик. Я не хочу каждый раз извлекать zip-файл. Следовательно, мне нужно читать содержимое файла (ex.txt) без извлечения zip-файла. Я попробовал код, как показано ниже. Но я могу только прочитать имя файла в переменной.

Как мне прочитать содержимое файла и сохранить его в переменной?

Заранее спасибо

fis=new FileInputStream("C:/Documents and Settings/satheesh/Desktop/ex.zip");
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;

while((entry = zis.getNextEntry()) != null) {
    i=i+1; 
    System.out.println(entry);
    System.out.println(i);
    //read from zis until available
}

person satheesh kumar    schedule 08.02.2013    source источник
comment
Как написано, ваш вопрос очень неясен. Вы хотите извлечь файлы из ZIP или нет? Какую конкретную проблему вы пытаетесь решить?   -  person parsifal    schedule 08.02.2013
comment
кстати: навигационные системы делают то же самое, они хранят данные своих цифровых дорожных карт в сжатом виде в основной памяти и распаковывают части по требованию   -  person AlexWien    schedule 08.02.2013


Ответы (3)


Попробуй это:

        ZipFile fis = new ZipFile("ex.zip");

        int i = 0;
        for (Enumeration e = zip.entries(); e.hasMoreElements();) {
            ZipEntry entry = (ZipEntry) e.nextElement();
            System.out.println(entry);
            System.out.println(i);

            InputStream in = fis.getInputStream(entry);

        }

Например, если файл содержит текст, и вы хотите напечатать его как строку, вы можете прочитать InputStream следующим образом: Чтение/преобразование InputStream в строку

person user000001    schedule 08.02.2013

Ваша идея состоит в том, чтобы прочитать zip-файл в виде массива байтов и сохранить его в переменной. Позже, когда вам понадобится zip, вы распаковываете его по требованию, экономя память:

Сначала прочитайте содержимое Zip-файла в массиве байтов zipFileBytes

Если у вас Java 1.7:

Path path = Paths.get("path/to/file");
byte[] zipFileBytes= Files.readAllBytes(path);

в противном случае используйте Appache.commons lib

byte[] zipFileBytes;
zipFileBytes = IOUtils.toByteArray(InputStream input);

Теперь ваш Zip-файл хранится в переменной zipFileBytes, все еще в сжатом виде.

Затем, когда вам нужно что-то извлечь, используйте

ByteArrayInputStream bis = new ByteArrayInputStream(zipFileBytes));
ZipInputStream zis = new ZipInputStream(bis);
person AlexWien    schedule 08.02.2013

Я думаю, что в вашем случае тот факт, что zip-файл представляет собой контейнер, который может содержать множество файлов (и, таким образом, заставляет вас переходить к нужному файлу каждый раз, когда вы его открываете), серьезно усложняет ситуацию, поскольку вы заявляете, что каждый zip-файл содержит только один текстовый файл. Может быть, намного проще просто сжать текстовый файл (gzip — это не контейнер, а просто сжатая версия ваших данных). И это очень просто использовать:

GZIPInputStream gis = new GZIPInputStream(new FileInputStream("file.txt.gz"));
// and a BufferedReader on top to comfortably read the file
BufferedReader in = new BufferedReader(new InputStreamReader(gis) );

Производить их одинаково просто:

GZIPOutputStream gos = new GZIPOutputStream(new FileOutputStream("file.txt.gz"));
person fvu    schedule 08.02.2013
comment
Это не ответ, он хочет zip в сжатом виде в переменной. Цитата: Я не хочу каждый раз извлекать на диск zip файл и потом читать его данные - person AlexWien; 08.02.2013
comment
@AlexWien Это не так, он просто позволяет читать содержимое (байт за байтом или как показано построчно) без расширения всего файла сразу, и я так понимаю, что это и есть OP после. Я просто хотел указать на альтернативу заархивированию файлов, с которой легче работать, чем с zip-файлом. Хранение zip-файла как такового в переменной imo не имеет практического применения. - person fvu; 08.02.2013
comment
Неясно, что он хотел, может быть, он хотел, чтобы ваше решение было разархивировано без создания нового файла на диске. Хранить zip-файл в переменной не всегда глупо: быстрее распаковывать из байтового массива, чем читать из файла: представьте, что вы должны разархивировать 100 раз в секунду, вы не можете сделать это с доступом к диску на встроенном устройстве с низкий кеш. Есть много приложений: например, системы сопоставления карт, которые вычисляют путь, по которому ехал автомобиль в двух больших странах: чтение с диска было бы слишком медленным. - person AlexWien; 08.02.2013