解压缩文件将文件转换为字节

Posted

技术标签:

【中文标题】解压缩文件将文件转换为字节【英文标题】:unzip file convert file to byte 【发布时间】:2011-08-26 14:15:23 【问题描述】:

我有应用程序从 url 下载 .zip 文件并将每个文件从 .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();

【问题讨论】:

我不明白你有什么问题。您似乎成功地将每个 zip 文件条目作为字节数组检索,但这就是您所说的需要帮助。 我的 zip 文件包含 2 个文件,每个文件都应转换为 byte[] 并作为 2 个单独的字节数组返回给其他应用程序 这是解压zip文件的好答案我希望你能得到解决方案Click Here 【参考方案1】:

您的while ((count = zis.read(buffer)) != -1) 行循环读取整个zip 文件。你想做的是count = zis.read(buffer, 0, entry.getSize())。这将在一个命令中将每个 zip 文件条目的内容转储到缓冲区中。

你会想要使这个字节数组更大。

或者,您可以保留小缓冲区,但只需确保在主循环的每次迭代中,您只读取 entry.getSize() 字节,否则您最终会读取整个文件。

【讨论】:

这是正确的想法,但不能保证调用read 可以读取完整数据,特别是因为数据是通过http 连接到达的。仍然需要循环,但终止条件需要是读取的字节数。 我认为,对于每个转换为字节的文件,我缺少一些迭代,任何代码帮助将不胜感激。【参考方案2】:

根据 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 ++;

【讨论】:

我工作了这个,它显示了负数组大小异常,然后我改变了我的 prog byte[] bytes = new byte[1024];它工作正常,即使它以前工作正常,但我的概念是我应该在某处保存第一个文件字节,在某处保存第二个文件。我想我应该再使用一次迭代来分别读取 2 个文件。

以上是关于解压缩文件将文件转换为字节的主要内容,如果未能解决你的问题,请参考以下文章

获取Zip文件中文件的解压缩流

unzip---解压缩“.zip”压缩包。

在C#中解压缩字节数组

C++项目:基于HuffmanTree实现文件的压缩与解压缩

压缩后的JS代码怎样解压缩?

Android - 解压缩文件夹?