Android中BufferedReader读取JSON文件返回null问题求助
问题分析与解决思路
嘿,我一眼就揪出你代码里的关键问题啦!咱们先看你saveCrimes方法里的finally块——你写反了流的关闭条件!
核心问题所在
你当前的finally块代码是:
if(writer == null) writer.close();
这完全搞反了逻辑!只有当writer不为null的时候,才需要调用close()来关闭流啊!
为什么会出现读取空值的情况?
OutputStreamWriter的写入操作是先把数据暂存在内存缓冲区里,只有当缓冲区被填满、手动调用flush(),或者调用close()的时候,缓冲区里的数据才会真正写入到文件中。你现在的代码里,当writer正常创建后,finally块因为writer != null,根本不会执行close(),导致JSON数据一直留在缓冲区里,从来没真正写到文件里——这就是为什么日志能打印出JSON字符串,但读取文件时却得到null的原因!
修正后的代码
把finally块的判断条件反过来就行:
public void saveCrimes(ArrayList<Crime> crimes) throws JSONException, IOException { JSONArray array = new JSONArray(); for(Crime c: crimes) array.put(c.toJSON()); Writer writer = null; try { OutputStream out = mContext.openFileOutput(mFileName, Context.MODE_PRIVATE); writer = new OutputStreamWriter(out); writer.write(array.toString()); Log.d(TAG, array.toString()); } finally { // 修正判断条件:writer不为null时才关闭 if(writer != null) { writer.close(); } } // 读取测试部分 BufferedReader bufferedReader = null; try { InputStream inputStream = mContext.openFileInput(mFileName); bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line = bufferedReader.readLine(); if (line == null) { Log.d(TAG, "WHY GOD WHYYYYYYY"); } else { Log.d(TAG, "读取到的数据:" + line); } } catch (IOException e) { e.printStackTrace(); } finally { if(bufferedReader != null) { bufferedReader.close(); } } }
更优雅的写法:使用try-with-resources
从Java 7开始,推荐用try-with-resources语法,它会自动关闭实现了AutoCloseable接口的资源,不用手动写finally块,能避免这类低级错误:
public void saveCrimes(ArrayList<Crime> crimes) throws JSONException, IOException { JSONArray array = new JSONArray(); for(Crime c: crimes) array.put(c.toJSON()); // try-with-resources自动关闭流 try (OutputStream out = mContext.openFileOutput(mFileName, Context.MODE_PRIVATE); Writer writer = new OutputStreamWriter(out)) { writer.write(array.toString()); Log.d(TAG, array.toString()); } // 读取测试同样用try-with-resources try (InputStream inputStream = mContext.openFileInput(mFileName); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { String line = bufferedReader.readLine(); if (line == null) { Log.d(TAG, "WHY GOD WHYYYYYYY"); } else { Log.d(TAG, "读取到的数据:" + line); } } catch (IOException e) { e.printStackTrace(); } }
这样修改后,数据就能正常写入文件,重启应用后也能正确读取啦!
内容的提问来源于stack exchange,提问作者user3917631
相关产品推荐
相关产品推荐

