首页 > 解决方案 > 将响应正文保存到 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

标签: android

解决方案


推荐阅读