Android 从json文件BufferedReader读取数据只返回null

Android 从json文件BufferedReader读取数据只返回null,android,json,bufferedreader,Android,Json,Bufferedreader,我目前正在学习一本叫做《android编程-大书呆子牧场指南》的书。 作为学习项目的一部分,我们创建Json序列化程序来保存和加载数据。写这个文件看起来很好,我在Logcat上没有收到任何错误消息。在我终止并重新创建应用程序后,将调用数据加载器并引发以下异常: org.json.JSONException:字符0处输入结束 我在网上查找过这个问题,认为可能是因为BufferedReader返回了一个空响应。我查过了,确实如此。 为了简单起见,我暂时将一个BufferedReader放入保存函数中

我目前正在学习一本叫做《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){

    }
}
公共犯罪(ArrayList犯罪)
抛出JSONException、IOException{
JSONArray数组=新的JSONArray();
(罪行c:罪行)
put(c.toJSON());
Writer=null;
试一试{
OutputStream out=mContext.openFileOutput(mFileName,Context.MODE\u PRIVATE);
writer=新的OutputStreamWriter(输出);
writer.write(array.toString());
Log.d(TAG,array.toString());
}最后{
if(writer==null)
writer.close();
}
//提取数据
BufferedReader BufferedReader=null;
试一试{
InputStream InputStream=mContext.openFileInput(mFileName);
bufferedReader=新的bufferedReader(新的InputStreamReader(inputStream));
if(bufferedReader.readLine()==null)
Log.d(标记“WHY GOD WHYYYYYYY”);
}捕获(IOE异常){
}
}
(代码中的两条日志消息,第一条显示我正在使用的JsonArray中的数据)

D/IncriminationContentJSONSerializer:[{“日期”:“周一-五月14日17:33:08 GMT+2018年00:00”,“id”:“97fe9532-991f-4352-9de1-602fa8dfa93e”,“已解决”:真,“标题”:“}] D/犯罪内容序列化器:为什么是上帝

我很想听听你的见解

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(anywhere)
时会发生什么呢?好吧,它不能调用一个新实例,而这个新实例已经被声明了……事实上,它已经被实例化为null。因此,无法创建同名的新实例

尝试删除指向null的行。然后,替换
BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(inputStream))

对于
try
块中的原始声明,请尝试检查
mFilename
第二次
try catch
时是否为空,通常在Android实例中很容易消失

PD:我建议您选择另一个JSON库来管理JSON文件,它们轻量级且易于使用

==编辑==

您是否在AndroidManifest上添加了写入和读取权限? 若答案是“就在那个里”,那个么试着一步一步地调试应用程序,寻找变量并在变量中检查值的存在

可能是文件本身未写入或写入为空

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

""
"[{"a": "abdc", "b": "jef2","
请注意BufferedReader,因为它读取每个文件的行,您需要所有文件,然后加入字符串变量


另外,尝试使用AndroidStudio中的android文件浏览器。在那里,您可以浏览文件、日志和数据库文件,并将它们导出到您的特定文件夹(文档、下载等)。通常应用程序编写的文件存储在
数据->

检查
mFilename
是否不同于null。将
if(writer==null)
更改为
if(writer!=null)
以避免NullPointerException。我已经检查过,没有NullPointerException。JSONException是我得到的唯一一个实例。在
bufferedReader=new bufferedReader(new InputStreamReader(inputStream))下面的3行中创建了一个新实例。分成两行不是问题,等等。你为什么要声明一个空的bufferedReader?为什么不在需要的时候实例化它呢?让我修改一下我的答案。嗨,我明白你的意思,在实例化它之前声明BufferedReader为null是多余的,实际上我已经将它改为BufferedReader BufferedReader;在这里张贴后。无论如何,这没什么区别,我不明白为什么它应该…是的,可能是一个多余的声明,但这是工作。在Java中创建对象实例有很多选项。mFileName是序列化程序类实例的一个参数,所以它不可能消失。。。但我还是检查了,这不是问题所在。我一直在考虑尝试Gson,听说它非常好,但想让他们在书中提供的解决方案首先起作用,它似乎相当简单。Gson是一个很好的库,我在我的项目中使用它,并且很容易集成到2。如果您需要加快JSON处理速度,我建议您使用Jackson。谢谢,我想找出我当前的实现有什么问题,这让我发疯了。。。