You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:44:32