如何将二进制数据转换为Zip文件?

时间:2014-04-01 06:36:07

标签: java android zip binary-data

现在我正在处理将二进制数据转换为zip文件的任务

我正在调用网址并从服务器获取响应,例如

A @B ArE⏾ 7 ϫ f N Yg o_M^ D T UX_ e? hi \ {{1} } NpM7 ñ !A)))AAFAq)Q) y   y . ? ֞ ֞ _ O nc f w ʰ 6 32 ƢZZ N0 O{ mC $ ,&gt ; CW /)?? 5ߗd = RJ * E {2LחWӑ_PRR_ @ _ H:ə ՋJ 1 v0wo + O -a @ R6P(0WPjk CE

现在我想将这些数据保存到zip文件中我已经搜索了很多并找到了一些链接但是没有达到目标。

我已经完成了

� �ڂ(� �0 rm��'�ed���� �:6h�k�ڗ� ���fnp���7��)��:��N�U�viR�,) II����M
如果您对此有任何疑问,请告诉我。

4 个答案:

答案 0 :(得分:3)

  

OutputStreamWriter osw

NO!

Writer用于编写文本,而不是二进制文件。

首先,它看起来像是读取文本,你不应该这样做。

使用InputStream阅读原始内容,并使用OutputStream写入文件:

final OutputStream out = /* open your file using a FileOutputStream here */;

final byte[] buf = new byte[8096]; // size as appropriate

// "in" is the InputStream from the socket
int count;

try {
    while ((count = in.read(buf)) != -1)
        out.write(buf, 0, count);

    out.flush();
} finally {
    out.close();
}

答案 1 :(得分:1)

读者并不打算阅读八位字节流。

从字符输入流中读取文本,缓冲字符,以便有效地读取字符,数组和行。

您正在寻找BufferedInputStream。

HttpEntity上的getContent()方法返回一个InputStream。将它包装在BufferedInputStream周围并将其写入文件或ByteArrayOutputStream。

    byte[] buffer = new byte[5 * 1024];
    int numRead = -1;
    while( (numRead = bufferedInputStream.read(buffer))!= -1)
    {
        byteArrayOutputStream.write(buffer, 0, numRead);
    }
    byteArrayOutputStream.flush();
    byteArrayOutputStream.close();
    byte[] result = byteArrayOutputStream.toByteArray();

为节省内存,我建议您写入BufferedOutputStream,而不是尝试将流中的字节转换为数据结构。对于大型zip文件,android设备可能会耗尽内存。

答案 2 :(得分:1)

通过向请求中添加选项,您也许可以避免转换Binary的麻烦。

NodeJS中,将responseType指定为arraybuffer

const res = await axios.get('/routToThat/file', {
  headers: {
    Accept: 'application/zip',
  },
  responseType: 'arraybuffer',
});

因此,与其以二进制字符串的形式接收服务器响应:

A@B�ArE⏾�7�ϫ���f�걺N�����Yg���o_M^�D�T�U X_���e?� hi\...

我得到一个缓冲区:

Buffer(22781691) [80, 75, 3, …]

注意:就我而言,我得到的响应已经是一个ZIP文件。

有关此NodeJS答案的更多详细信息。 https://stackoverflow.com/a/62460311/3645464

答案 3 :(得分:0)

我需要做的就是从实体构造一个BufferedInputStream。只需用BufferedInputStream替换BufferedReader即可。我建议使用ISO-8859-1。底层流编码器读取二进制数据是浪费处理能力。

private class methodName extends
            AsyncTask<String, Integer, byte[]> {

        @Override
        protected byte[] doInBackground(String... params) {
            String uri = params[0];
            try {

                MultipartEntityBuilder entity;
                File f;
                FileBody fb;
                entity = MultipartEntityBuilder.create();

                entity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
                f = new File(zipImageFile);
                fb = new FileBody(f);
                entity.addPart("orderFile", fb);
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost(uri);
                Log.e("Uploload Missing Image URL", "" + uri);
                httppost.setEntity(entity.build());
                HttpResponse response = httpclient.execute(httppost);
    //              byte[] fileBites=null;
               BufferedInputStream bufferedInputStream;
               ByteArrayOutputStream byteArrayOutputStream;
                byte[] buffer = new byte[5 * 1024];
                int numRead = -1;
                while( (numRead = bufferedInputStream.read(buffer))!= -1)
                {
                    byteArrayOutputStream.write(buffer, 0, numRead);
                }
                byteArrayOutputStream.flush();
                byteArrayOutputStream.close();
                byte[] result = byteArrayOutputStream.toByteArray();

    //              fileBites=stringBuffer.toString().getBytes();
    //              Log.e("FILE BITES", fileBites+"=>"+fileBites.length);



                return ;

    //              return stringBuffer.toString();
            } catch (Exception e) {
                return e.toString().getBytes();
            }

        }

        @Override
        protected void onPostExecute(byte[] result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            Log.e("Response From Server", "" + result);
            writeToFile(result);

        }

    }


    private void writeToFile(byte[] data) {
        try {

            FileOutputStream fop = null;
            File file;

            file = new File(AppConstants.DataPath+"/products.zip");
            fop = new FileOutputStream(file);

            // if file doesnt exists, then create it
            if (!file.exists()) {
                file.createNewFile();
            }
            try {            
            fop.write(data);

        } catch (IOException e) {
            Log.e("Exception", "File write failed: " + e.toString());
        }
        unzipImage(AppConstants.DataPath + "/products.zip",
                AppConstants.DataPath);
    }catch (Exception E)
    {

    }
    }