2013-10-08 2 views
1

Резюме: Имея байт изображения из a.zip, который содержит a.txt, как я могу получить чистый и правильный читатель, который возвращает строки текстового файла?Читатель для получения текстовых строк из текстового файла архивного

Я загружаю изображение zip-файла с веб-службы в byte[] content. Я хотел бы написать метод, как

private BufferedReader contentToBufferedReader(byte[] content) 

, который возвращает читателя, который может быть использован как

reader = contentToBufferedReader(content); 
while ((line = reader.readLine()) != null) { 
    processThe(line); 
} 
reader.close() 

До сих пор у меня есть (обновленный)

private BufferedReader contentToBufferedReader(byte[] content) { 

    ByteArrayInputStream bais = new ByteArrayInputStream(content); 
    ZipInputStream zipStream = new ZipInputStream(bais); 
    BufferedReader reader = null; 

    try { 
     ZipEntry entry = zipStream.getNextEntry(); 

     // I need only the first (and the only) entry from the zip file. 
     if (entry != null) { 
      reader = new BufferedReader(new InputStreamReader(zipStream, "UTF-8")); 
      System.out.println("contentToBufferedReader(): success"); 
     } 
    } 
    catch (IOException e) { 
     System.out.println("contentToBufferedReader(): failed..."); 
     System.out.println(e.getMessage()); 
    } 

    return reader; 
} 

I я не уверен, как закрыть весь объект потока, когда что-то не получается. Более того, я не уверен, как их закрыть, если reader был успешно возвращен, использован и закрыт.

+2

Возможный дубликат [Чтение текстовых файлов в zip-архиве] (http://stackoverflow.com/questions/4473256/reading-text-files-in-a-zip-archive) –

+0

Спасибо, Катя, за подсказку о том, как украсить ' zipStream'. Я изменил вопрос, чтобы он не считался дубликатом упомянутого вами вопроса. – pepr

ответ

1

Это позволит получить байты все на одном дыхании (используется гуавы ByteStreams для удобства)

ZipEntry entry = zipStream.getNextEntry(); 
while (entry != null) { 
    if (!entry.isDirectory()) { 
    String filename = entry.getName();//this includes the path! 
    byte[] data = ByteStreams.toByteArray(zipStream); 
    //do something with the bytes 
    } 
    entry = zipIn.getNextEntry(); 
} 

вы можете получить читателя, как это:

InputStreamReader reader = new InputStreamReader(new ByteArrayInputStream(data))); 

zipStream продвигается при вызове zipStream.getNextEntry(). Я также думаю, что поток не поддерживает отметку и перезагружает iirc, что означает, что вы только прочитаете ее один раз (отсюда сразу все получится, прежде чем передавать ее на другую обработку, которая может потребовать произвольного доступа)

+0

+1 Спасибо, что научили меня «entry.isDirectory()». В противном случае я предпочитаю не извлекать содержимое 'zipStream' в' byte [] ', если я могу его избежать. Кроме того, я бы предпочел называть 'zipStream.getNextEntry()' только в одном месте - в состоянии 'while'. – pepr

+0

Рад помочь. Обратите внимание, что даже если вы не вытащите все байты сразу, убедитесь, что вы только читали их один раз. У меня были кошмары, открывающие это. – tom

1

Проверьте эту тему, вам, вероятно, придется сначала разархивировать файл, а затем прочитать его.

What is a good Java library to zip/unzip files?

+0

+1 для ссылки. Я нашел, что 'zip4j' может быть хорошей альтернативой стандартной поддержке zip для Android. Кажется, что zip-образ, который я получаю, использует zip64, который не поддерживается 'ZipInputStream'. – pepr

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