2013-09-30 3 views
0

Я хочу извлечь данные, возвращенные сторонним веб-сервисом. Ответ анализируется XmlPullParser. Блок данных - это декодированный Base64 TEXT одного элемента. До сих пор мой анализатор содержит код:Разархивировать базовый ответ веб-службы на лету?

   assert eventType == XmlPullParser.TEXT; 
       content = xpp.getText(); 

content является упомянутым блоком данных. Он работает, но он может быть длиной более 100 кбайт. Мне нужно проанализировать содержимое, используя другой синтаксический анализатор, который:

  1. Декодировать блок данных, закодированный через base64. Результатом является образ zip-файла с одним ZIP-файлом внутри.

  2. Извлечь содержимое заархивированного файла - оно находится в формате CSV.

  3. Проведите анализ строк CSV-файла и извлеките данные.

Если я знаю имя файла в zip-архиве, можно ли его обрабатывать «на лету» с помощью объектов Android/Java? (На лету - я имею в виду, не сохраняя его сначала в файле.) Или, как и где я могу создать временный файл, извлеченный из содержимого zip-файла?

ответ

2

Да, вы можете разобрать эти файлы на лету.

byte[] decodedContent = Base64.decode(content, Base64.DEFAULT); 

ZipInputStream zipStream = new ZipInputStream(new ByteArrayInputStream(decodedContent)); 

try{ 
    ZipEntry entry = null; 

    while ((entry = zipStream.getNextEntry()) != null) { 

     String fileName = entry.getName(); 

     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

     byte[] buffer = new byte[1024]; 
     int count; 

     while ((count = zipStream.read(buffer)) != -1) { 
      baos.write(buffer, 0, count); 
     } 

     baos.close(); 
     zipStream.closeEntry(); 

     byte[] bytes = baos.toByteArray(); 

     //Your own code to parse the CSV 
     parseCsvFile(fileName, bytes); 
    } 

}finally{ 
    zipStream.close(); 
} 
+0

У меня проблема с 'zipStream.getNextEntry()'. Из-за этого я добавил 'catch (IOException e) {System.out.println (e.getMessage()); } '. Он не может читать локальный заголовок версии 45. (По-видимому, некоторая ошибка между моим стулом и клавиатурой.) Я сохранил 'decodedContent' в Download/output.zip', а Total Commander для Android способен извлечь файл. В чем может быть проблема? – pepr

+0

Я нашел ответ здесь http://stackoverflow.com/a/15566221/1346705. Вероятно, я в такой же ситуации. Спасибо за код. – pepr

1

Используется для декодирования из base64: http://commons.apache.org/proper/commons-codec/apidocs/org/apache/commons/codec/binary/Base64.html

Если вы разрабатываете для SDK 8 или выше вы также можете использовать: http://developer.android.com/reference/android/util/Base64.html

Используйте это, чтобы распаковать декодированного base64: http://developer.android.com/reference/java/util/zip/ZipInputStream.html

Используйте ByteArrayInputStrean для использования разархивированной с расшифрованным основанием64: http://developer.android.com/reference/java/io/ByteArrayInputStream.html

И вот еще для разбора файла CVS: CSV API for Java

+1

SDK имеет встроенный в Base64 декодер: http://developer.android.com/reference/android/util/Base64.html –

+1

Да, но только уровень API 8 и выше. Я изменил свой ответ соответственно. –