вопрос возник как всегда на ровном месте. понадобилось прочесть из zip-архива, что входит в apk (т.е. в проекте лежит в папке assets), файл. не распаковывать весь архив или файлы на диск/флешку (вдруг там места нет), а именно
прочитать файл в поток и сразу закинуть его в Drawable для использования как фона кнопки, обоев и пр. (впрочем, там будут и файлы других форматов)
вот пример того, как я рылся в архивах до этого печального момента:
/* zipfilename - имя файла архива, filename - файл, который нужно найти в архиве *
* unzipfilename - имя (и путь) файла, в который будет распакован файл filename */
public static void zipExtract(String zipfilename, String filename, String unzipfilename) {
try {
// буфер для чтения из архива
byte[] buf = new byte[1024];
// поток архива
ZipInputStream zipinputstream = null;
// вхождения в архив
ZipEntry zipentry;
// создаем поток архива, параметр - свежесозданный поток файла архива
zipinputstream = new ZipInputStream(
new FileInputStream(zipfilename));
// получаем очередное вхождение в архив
zipentry = zipinputstream.getNextEntry();
// пока все вхождения в архив не кончатся
while (zipentry != null) {
// получаем имя вхождения (запакованного файла или папки)
String entryName = zipentry.getName();
if (entryName == filename) {
// количество фактически прочитанных байтов
int n;
// поток для записи распакованного файла/папки
FileOutputStream fileoutputstream;
// открываем файл вхождения (файла/папки)
File newFile = new File(entryName);
// если очередное вхождение - папка, то пропускаем текущую итерацию цикла
String directory = newFile.getParent();
if(directory == null) {
if(newFile.isDirectory())
break;
}
// если вхождение - файл, то создаем выходной поток для записи распакованного файла
fileoutputstream = new FileOutputStream(filename);
// переписываем весь файл из архива в созданный поток
while ((n = zipinputstream.read(buf, 0, 1024)) > -1)
fileoutputstream.write(buf, 0, n);
// закрываем поток
fileoutputstream.close();
// закрываем вхождение
zipinputstream.closeEntry();
// получаем следующее вхождение
zipentry = zipinputstream.getNextEntry();
}
}
// закрываем поток архива
zipinputstream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
самому странно, что такую простую, вроде бы, вещь как извлечение файла из архива сразу в картинку не удается реализовать без необходимости распаковывать данные сначала в файлы(((
говорю сразу - мануалами уже обчитался. какаю кодом, блюю газетой. так что просьба ответить тем, у кого есть идеи по теме, а не советы типа "кури мануалы".
заранее благодарен.