2013-02-08 3 views
5

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

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

Спасибо заранее

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 
} 
+1

Как написано, ваш вопрос очень неясно. Вы хотите извлечь файлы из ZIP или нет? Какую * конкретную проблему вы пытаетесь решить? – parsifal

+0

bye the way: Navigation Sytems делают это так же, они сохраняют свои цифровые данные дорожных карт, сжатые в основной памяти, и разархивируют детали по запросу – AlexWien

ответ

5

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

Сначала прочитайте содержимое файла 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); 
4

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

 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 следующим образом: Read/convert an InputStream to a String

2

Я думаю, что в вашем случае тот факт, что zipfile является контейнером, который может хранить много файлов (и, таким образом, вы можете перемещаться в каждый файл, содержащийся в правом архиве каждый раз, когда вы его открываете) серьезно усложняет ситуацию, поскольку вы заявляете, что каждый zip-файл содержит только один текстовый файл. Возможно, намного проще просто gzip текстовый файл (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")); 
+0

Это не ответ, он хочет, чтобы почтовый индекс был сжат в переменной. Цитата: Я не хочу извлекать на диск zip-файл каждый раз, а затем читать его данные – AlexWien

+0

@AlexWien Это не так, он просто позволяет читать содержимое (байт по байтам или как показано по строкам) ** без расширяя ** весь файл сразу, и я понял, что это то, что происходит после OP. Я просто хотел указать на альтернативу перекодированию файлов, с которыми легче работать, чем с zip-файлом. Хранение zip-файла как такового в переменной imo не имеет практического применения. – fvu

+0

Непонятно, чего он хотел, может быть, он хотел, чтобы ваше решение, распаковать без создания нового файла на диске. Не всегда глупо хранить zip-файл в avariable: его способы ускорить распаковывание из массива байтов, чем чтение из файла: представьте, что вы должны разархивировать 100 раз в секунду, вы не можете делать это с дисковыми входами, на электронном устройстве с низкий кеш. Существует много приложений: например, системы сопоставления карт, которые вычисляют дорожку, по которой автомобиль двигался в двух больших странах: чтение с диска было бы медленным – AlexWien

Смежные вопросы