android - 将响应正文保存到 Android 上的存储
问题描述
我正在使用retrofit2从nodeJs服务器获取一个zip文件,当我将响应正文写入磁盘时,它无法正常工作,我用来保存:
private boolean writeResponseBodyToDisk(ResponseBody body) {
try {
// todo change the file location/name according to your needs
File futureStudioIconFile = new File(Environment.getExternalStorageDirectory() + File.separator + "file.zip");
System.out.println(Environment.getExternalStorageDirectory());
InputStream inputStream = null;
OutputStream outputStream = null;
try {
byte[] fileReader = new byte[4096];
long fileSize = body.contentLength();
long fileSizeDownloaded = 0;
System.out.println("filesize"+fileSize);
inputStream = body.byteStream();
System.out.println("inputStream"+inputStream);
outputStream = new FileOutputStream(futureStudioIconFile);
while (true) {
int read = inputStream.read(fileReader);
if (read == -1) {
break;
}
outputStream.write(fileReader, 0, read);
fileSizeDownloaded += read;
Log.d(TAG, "file download: " + fileSizeDownloaded + " of " + fileSize);
}
outputStream.flush();
return true;
} catch (IOException e) {
return false;
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
}
} catch (IOException e) {
return false;
}
}
这就是我得到 responseBody 的方式:
public static RetrofitInterface getRetrofitFile(){
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
System.out.println(Constants.BASE_URL);
try {
// Create a trust manager that does not validate certificate chains
final TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
httpClient.sslSocketFactory(sslSocketFactory, (X509TrustManager)trustAllCerts[0]);
httpClient.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
httpClient.addInterceptor(chain -> {
Request original = chain.request();
Request.Builder builder = original.newBuilder()
.method(original.method(),original.body());
return chain.proceed(builder.build());
});
} catch (Exception e) {
throw new RuntimeException(e);
}
RxJavaCallAdapterFactory rxAdapter = RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io());
return new Retrofit.Builder()
.baseUrl(Constants.BASE_URL)
.client(httpClient.build())
.addCallAdapterFactory(rxAdapter)
.addConverterFactory(GsonConverterFactory.create())
.build().create(RetrofitInterface.class);
}
我得到的文件是一个 zip 文件。问题是我下载的文件大小为 87Kb,而我写的文件只有 7Kb:
D/sout : File Size=-1
D/sout :file saved 7958/-1 >>>> -7958.0
解决方案
推荐阅读
- dart - Flutter 中的路由守卫
- sql - tsrange计算时间间隔?
- python - 使用 Django 从服务器获取多张图片
- oracle12c - Liquibase 不支持的 major.minor 版本 51.0
- css - 使用带有 rem = 10px 的引导程序的问题
- python - 将字典中的所有值设为小写
- vb.net - VB.NET 面板无法在 groupbox 内正确显示
- javascript - 在 NextJS 中显示多条 JSON 记录
- javascript - 在 a 中写入一个元素
- 带有 Javascript 的元素
- python - 在 Scikit-Learn 中获得线性回归的大交叉验证分数