распаковать файл преобразовать файл в байт

У меня есть приложение для загрузки файла .zip из URL-адреса и преобразования каждого файла из файла .zip в массив байтов. На данный момент я могу загрузить файл, прочитать файл .zip и преобразовать весь файл .zip в байт, но столкнулся с преобразованием каждого файла внутри .zip в массив байтов. Любая помощь будет признательна. Я прикрепил свой код ниже:

try {
    URL url = new URL(Url);
    //create the new connection
    HttpURLConnection urlConnection = (HttpURLConnection)                                url.openConnection();

    //set up some things on the connection
    urlConnection.setRequestMethod("GET");
    urlConnection.setDoOutput(true); 
    //and connect!
    urlConnection.connect();
    //set the path where we want to save the file
    //in this case, going to save it on the root directory of the
    //sd card.
    InputStream inputStream = urlConnection.getInputStream();
    dis = new DataInputStream(new BufferedInputStream(inputStream));
    System.out.println("INput connection done>>>>>");

    zis = new ZipInputStream(new BufferedInputStream(dis));

    String targetFolder="/sdcard/";

    System.out.println("zip available is"+zis.available());

    int extracted = 0;

    while ((entry = zis.getNextEntry()) != null) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int count;

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

        String filename = entry.getName();
        System.out.println("File name is>>"+filename);

        byte[] bytes = baos.toByteArray();
        System.out.println("Bytes is >>>>"+bytes.toString());
        // do something with 'filename' and 'bytes'...
        zis.closeEntry();

        extracted ++;
    }

    zis.close();

} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

person naveen    schedule 26.08.2011    source источник
comment
Я не понимаю, какая у тебя проблема. Кажется, вы успешно извлекаете каждую запись zip-файла в виде массива байтов, но это то, с чем вы говорите, что вам нужна помощь.   -  person Ted Hopp    schedule 26.08.2011
comment
Мой zip-файл содержит 2 файла, каждый файл должен быть преобразован в байт [] и возвращен как 2 отдельных массива байтов в другое приложение.   -  person naveen    schedule 26.08.2011
comment
Это хороший ответ для извлечения zip-файла. Надеюсь, вы получите решение Нажмите здесь   -  person Dharmendra    schedule 26.08.2011


Ответы (2)


Ваша строка while ((count = zis.read(buffer)) != -1) зацикливается на чтении всего zip-файла. То, что вы хотите сделать, это count = zis.read(buffer, 0, entry.getSize()). Это позволит одной командой выгрузить содержимое каждой записи zip-файла в ваш буфер.

И вы захотите сделать этот массив байтов намного больше.

В качестве альтернативы вы можете сохранить свой небольшой буфер, но просто убедитесь, что для каждой итерации основного цикла вы читаете только entry.getSize() байта, иначе вы в конечном итоге прочитаете весь файл.

person Jon7    schedule 26.08.2011
comment
Это правильная идея, но один вызов read не гарантирует считывания всех данных, особенно если данные поступают по http-соединению. Цикл по-прежнему необходим, но условием завершения должно быть количество прочитанных байтов. - person Ted Hopp; 26.08.2011
comment
Я думаю, что мне не хватает еще одной итерации для каждого преобразования файла в байт, любая помощь в коде будет оценена. - person naveen; 26.08.2011

Основываясь на ответе Jon7 (который действительно должен получить признание, если это решит вашу проблему), попробуйте следующее:

while ((entry = zis.getNextEntry()) != null) {
    String filename = entry.getName();
    int needed = entry.getSize();
    byte[] bytes = new byte[needed];
    int pos = 0;
    while (needed > 0) {
        int read = zis.read(bytes, pos, needed);
        if (read == -1) {
            // end of stream -- OOPS!
            throw new IOException("Unexpected end of stream after " + pos + " bytes for entry " + filename);
        }
        pos += read;
        needed -= read;
    }

    System.out.println("File name is>>"+filename);
    System.out.println("Bytes is >>>>"+bytes.toString());
    // do something with 'filename' and 'bytes'...
    zis.closeEntry();

    extracted ++;
}
person Ted Hopp    schedule 26.08.2011
comment
Я работал с этим, он показал исключение отрицательного размера массива, затем я изменил свой программный байт [] байты = новый байт [1024]; он работает нормально, даже раньше он работал нормально, но моя концепция заключается в том, что я должен где-то сохранить 1-й байт файла, и 2-й файл где-то. Думаю, мне следует использовать еще одну итерацию, чтобы прочитать 2 файла отдельно. - person naveen; 26.08.2011