Показать сообщение отдельно
Старый 02.11.2013, 14:02   #1
barsunduk
ПроЭктировщик
 
Аватар для barsunduk
 
Регистрация: 09.05.2010
Адрес: рф ро шахты
Сообщений: 177
Написано 66 полезных сообщений
(для 271 пользователей)
загрузка картинки из архива сразу в Drawable

вопрос возник как всегда на ровном месте. понадобилось прочесть из zip-архива, что входит в apk (т.е. в проекте лежит в папке assets), файл. не распаковывать весь архив или файлы на диск/флешку (вдруг там места нет), а именно прочитать файл в поток и сразу закинуть его в Drawable для использования как фона кнопки, обоев и пр. (впрочем, там будут и файлы других форматов)

вот пример того, как я рылся в архивах до этого печального момента:
/* zipfilename - имя файла архива, filename - файл, который нужно найти в архиве *
     * unzipfilename - имя (и путь) файла, в который будет распакован файл filename  */
    
public static void zipExtract(String zipfilenameString filenameString 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 ((zipinputstream.read(buf01024)) > -1)
                        
fileoutputstream.write(buf0n);
                    
// закрываем поток
                    
fileoutputstream.close();
                    
// закрываем вхождение
                    
zipinputstream.closeEntry();
                    
// получаем следующее вхождение
                    
zipentry zipinputstream.getNextEntry();
                }
            }
            
// закрываем поток архива
            
zipinputstream.close();
        } catch (
Exception e) {
            
e.printStackTrace();
        }
    } 
самому странно, что такую простую, вроде бы, вещь как извлечение файла из архива сразу в картинку не удается реализовать без необходимости распаковывать данные сначала в файлы(((
говорю сразу - мануалами уже обчитался. какаю кодом, блюю газетой. так что просьба ответить тем, у кого есть идеи по теме, а не советы типа "кури мануалы".

заранее благодарен.
__________________
to be or not to be - it's not a question!
2b or not 2b = ff

Последний раз редактировалось barsunduk, 02.11.2013 в 22:15.
(Offline)
 
Ответить с цитированием