现在我正在处理将二进制数据转换为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
如果您对此有任何疑问,请告诉我。
答案 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)
{
}
}