【问题标题】:save json file in cache error将 json 文件保存在缓存中错误
【发布时间】:2017-01-12 10:47:53
【问题描述】:

我需要你下载大约 30 MB 的 Json 并在之前保存它以进行百分之一的下载。所以我实现了这段代码:

 private void downloadAirports()
{
    final OkHttpClient mOkHttpClient = new OkHttpClient();

    final Request mRequest = new Request.Builder().url(SERVICE_ENDPOINT).build();

    Observable.create(new Observable.OnSubscribe<String>()
    {
        @Override
        public void call(Subscriber<? super String> subscriber)
        {
            try {
                InputStream inputStream;
                Response response = mOkHttpClient.newCall(mRequest).execute();
                if (response.isSuccessful())
                {
                   inputStream = response.body().byteStream();
                   long len = response.body().contentLength();

                    Log.d("str",String.valueOf(len));

                    String progress = "0";
                    subscriber.onNext(progress);

                    final int bufferSize = 1024;
                    flag = false;
                    final byte[] buffer = new byte[bufferSize];
                    final StringBuilder out = new StringBuilder();
                    Reader in = new InputStreamReader(inputStream, "UTF-8");
                    ByteArrayOutputStream byteOutStream = new ByteArrayOutputStream();

                    long total = 0;
                    airp = new ArrayList<AirportObject>();
                    int count =0;

                    /*while ((count = inputStream.read(data)) != -1)
                    {
                        total += count;
                        progress = String.valueOf(total * 100 / len);
                        subscriber.onNext(progress);
                    }*/




                while(!flag)
                    {
                        count = inputStream.read(buffer);

                        if (count == -1)
                        {
                            progress = "100";
                            subscriber.onNext(progress);
                            flag = true;

                        }
                        else
                        {
                            byteOutStream.write(buffer);
                            total += count;
                            progress = String.valueOf(total * 100 / len);
                            subscriber.onNext(progress);
                        }
                    }



    //                        byte[] res = byteOutStream.toByteArray();

                    File jsonFile = new File(getActivity().getCacheDir(), FILE_NAME);
                    FileOutputStream outStream = new FileOutputStream(jsonFile);
                    byteOutStream.writeTo(outStream);

                    byteOutStream.flush();
                    inputStream.close();
                    byteOutStream.close();
                    Log.d("length", String.valueOf(jsonFile.length()));
                    Log.d("str",String.valueOf(len));

                    //write the whole data into the file
                   /* for(int i = 0; i < res.length; i++)
                    {
                        outStream.write(res[i]);
                    }*/

                    Gson gson = new Gson();

                    JsonReader reader = new JsonReader(new FileReader(jsonFile));

                    airp = new ArrayList<>();

                    reader.beginArray();


                    while (reader.hasNext())
                    {

                          AirportObject airport = gson.fromJson(reader, AirportObject.class);
                          airp.add(airport);

                    }

                    reader.endArray();
                    reader.close();

                }

                 subscriber.onCompleted();
               }
             catch (IOException e)
             {
                e.printStackTrace();
             }


        }
    }).subscribeOn(Schedulers.newThread())
            .subscribe(new Subscriber<String>() {

                public void onCompleted()
                {
                    Log.wtf("on complete","On complete");
                }

                @Override
                public void onError(Throwable e)
                {
                    e.printStackTrace();
                }

                @Override
                public void onNext(final String progress) {

                        getActivity().runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                     Log.d("%",progress);
                                }
                        });


                }
            });
}

但是我有这个问题:如果我使用我在 cmets 中放入的代码(字节数组和 for 循环),它会很慢但它可以工作,如果我使用我已经发布的代码,当我打印文件大小的日志时出现此错误:

D/length: 25767936
D/str: 24672558

其中 lenght 是我在缓存中创建的文件的维度,str 是下载的维度。所以我用MalformedJson这个bug在Gson中给出了一些错误。

我该如何解决这个错误?

【问题讨论】:

    标签: android json gson


    【解决方案1】:

    根据 OP,这一行:

    count = inputStream.read(buffer);
    

    应该是:

    count = inputStream.read(buffer,0,count);
    

    【讨论】:

    • @ste9206 这个答案是community wiki 答案 - 随时编辑它,详细说明问题所在以及解决问题的原因。
    猜你喜欢
    • 1970-01-01
    • 2014-07-14
    • 2017-05-04
    • 2017-08-17
    • 1970-01-01
    • 2011-10-02
    • 2022-01-16
    • 1970-01-01
    • 2012-09-10
    相关资源
    最近更新 更多