【问题标题】:Reading data from a json file BufferedReader returns only null从 json 文件 BufferedReader 读取数据仅返回 null
【发布时间】:2018-05-14 18:00:03
【问题描述】:

我目前正在通过一本名为“Android Programming - The Big Nerd Ranch Guide”的书学习 android。 作为学习项目的一部分,我们创建 Json 序列化程序来保存和加载数据。写入文件看起来工作正常,我在 Logcat 上没有收到错误消息。在我终止应用程序并重新创建它后,数据加载器被调用并引发以下异常:

org.json.JSONException: 在字符 0 处输入结束

我在网上查找了这个问题,并认为这可能是因为 BufferedReader 返回一个空响应。我查过了,确实是这样。 为简单起见,我暂时将 BufferedReader 放入保存函数并尝试读取我刚刚保存到文件中的信息,但 BufferedReader 仍然只返回 null。

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 {
        if(writer == null)
            writer.close();
    }
    // Extracting the data
    BufferedReader bufferedReader = null;
    try {
        InputStream inputStream = mContext.openFileInput(mFileName);
        bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        if (bufferedReader.readLine() == null)
            Log.d(TAG, "WHY GOD WHYYYYYYY");
    }catch (IOException e){

    }
}

(代码中的两条日志消息,第一条显示我正在使用的 JsonArray 中的数据)

D/CriminalIntentJSONSerializer: [{"date":"Mon May 14 17:33:08 GMT+00:00 2018","id":"97fe9532-991f-4352-9de1-602fa8dfa93e","isSolved":真,"标题":""}] D/CriminalIntentJSONSerializer: WHY GOD WHYYYYYYY

很想听听您的见解。

【问题讨论】:

  • 检查mFilename 是否不同于null。将 if(writer == null) 更改为 if(writer != null) 以避免 NullPointerException。
  • 没有 NullPointerException,我已经检查过了。 JSONException 是我得到的唯一一个。

标签: android json bufferedreader


【解决方案1】:
BufferedReader bufferedReader = null;
try {
    InputStream inputStream = mContext.openFileInput(mFileName);
    bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
    if (bufferedReader.readLine() == null)
        Log.d(TAG, "WHY GOD WHYYYYYYY");
}catch (IOException e){

}

好的。你已经创建了你的BufferedReader bufferedReader = null; 当你说bufferedReader = new BufferedReader(anything) 时会发生什么......嗯......它不能调用一个已经声明的新实例......事实上,它已经被实例化为null。所以你不能创建一个同名的新实例。

尝试删除指向 null 的行。然后,替换 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 对于 try 块中的原始声明

【讨论】:

  • bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 下方3 行创建了一个新实例。分成两行不成问题。
  • 等等。你为什么要声明一个 null bufferedReader 呢?为什么不在需要时实例化它?
  • 让我修改我的答案。
  • 嗨,我明白你的意思是在实例化之前声明 BufferedReader null 是多余的,我实际上已将其更改为 BufferedReader bufferedReader;在这里发帖后。无论如何,它没有任何区别,我不明白为什么它应该......
  • 是的,可能是一个多余的声明,但它的工作。在 Java 中创建对象实例有很多选择。
【解决方案2】:

尝试在第二个try-catch 时检查mFilename 是否为空,通常在Android 实例中很容易消失。

PD:我建议你选择另一个 JSON 库来处理 JSON 文件,它们是轻量级的,并且 easy-to-use

== 编辑 ==

您是否在 AndroidManifest 上添加了写入和读取权限? 如果答案是“它就是”,请尝试逐步调试应用程序,查找变量和非变量以检查值是否存在。

可能是文件没有写入自身或写入为空。

错误基本上是空字符串或非格式 JSON:

""
"[{"a": "abdc", "b": "jef2","

注意BufferedReader,因为它每行读取一行,你需要所有文件,然后加入字符串变量。

另外,尝试使用 AndroidStudio 中的 android 文件资源管理器。在那里,您可以浏览文件、日志和数据库文件并将它们导出到您的特定文件夹(文档、下载等)。一般app写入的文件存放在data -&gt; &lt;com.your.app.package&gt;

【讨论】:

  • mFileName 是序列化程序类实例的一个参数,所以它不可能就这样消失......但我检查了一切,这不是问题。一直想试试Gson,听说很不错,但是想先让他们在书中提供的解决方案生效,看起来还挺简单的。
  • Gson 是一个很好的库,我在我的项目中使用它并且很容易集成到 Retrofit2 中。如果您需要快速 JSON 处理,我推荐您 Jackson
  • 谢谢,我想弄清楚我当前的实现出了什么问题,这让我发疯了......
猜你喜欢
  • 2014-09-26
  • 2020-07-13
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 2016-05-13
  • 2013-04-29
  • 1970-01-01
相关资源
最近更新 更多