Skip to content

读写json文件

这里讲的json是指key-value类型的文本文件。

例如

{
    "key1": 1,
    "key2": "Rust Fisher"
}

接下来的例子会分为几个步骤:

  • 定义数据类
  • 写文件
  • 读文件

定义数据类

为了更直观,我们定义一个类Info1来存放数据

public class Info1 {

    private String name;
    private long time;

    // 构造器和get set方法省略

    @NonNull
    @Override
    public String toString() {
        return name + ", " + time;
    }
}
重写了toString方法,打log的时候可以更方便地看到感兴趣的信息。

现在这个类是用来模拟业务数据的。实际工程中可能是后台传回的具体数据。

写文件

为了更方便操作json,我们使用Google的gson库来操作json。

dependencies {
    implementation 'com.google.code.gson:gson:2.8.5'
}

目标文件存放在app内部存储中。

mFile1Path = getFilesDir().getAbsolutePath() + File.separator + "rwFile"
        + File.separator + "jsonFile1.json";

读写文件等io操作,应该放在子线程内。这里为了演示方便,只给出关键代码。

private void write1(Info1 info1) {
    Gson gson = new Gson();
    String jsonText = gson.toJson(info1);
    Log.d(TAG, "write1: jsonText: " + jsonText);
    File file = new File(mFile1Path);
    try {
        if (file.exists()) {
            boolean d1 = file.delete();
            Log.d(TAG, "delete old file: " + d1);
        }
        File dir = file.getParentFile();
        if (dir != null && !dir.exists()) {
            boolean m1 = dir.mkdirs();
            Log.d(TAG, "write1: create dir: " + m1);
        }
        boolean c1 = file.createNewFile();
        Log.d(TAG, "create new file: " + c1);
        OutputStream os = new FileOutputStream(file);
        os.write(jsonText.getBytes());
        os.flush();
        os.close();
    } catch (IOException e) {
        e.printStackTrace();
        Log.e(TAG, "write1: ", e);
    }
}
使用Gson.toJson方法,把一个对象转换为json格式的字符串。 然后用FileOutputStream写入文件中。

执行这个方法后,我们可以用as的Device File Explorer面板找到这个文件。

本例中,文件路径是/data/data/com.rustfisher.tutorial2020/files/rwFile/jsonFile1.json

用as双击它可以看到内容。例如:

{"name":"RustFisher","time":1605266868256}

读文件

从文件中读出文本,然后转换为相应的对象。

private Info1 read1() {
    File file = new File(mFile1Path);
    if (file.exists() && file.isFile()) {
        try {
            BufferedReader reader = new BufferedReader(new FileReader(file));
            String inString;
            StringBuilder sb = new StringBuilder();
            while ((inString = reader.readLine()) != null) {
                sb.append(inString);
            }
            Gson gson = new Gson();
            return gson.fromJson(sb.toString(), Info1.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
    } else {
        Log.d(TAG, "read1: 文件不存在 " + file);
    }
    return null;
}
BufferedReader读出文件的字符串。 用Gson.fromJson方法将其转换成目标对象。

小结一下:

  • 首先自定义一个类,用来模拟业务数据
  • 确定文件存放路径,例如存放在app内部路径Context.getFilesDir()
  • 将对象转换为json格式字符串,使用Gson.toJson方法
  • json格式字符串转为对象,使用Gson.fromJson方法
  • 文件操作,把文本写入文件FileOutputStream
  • 读取文件中的文本,BufferedReader

作者: RustFisher
联系: rf.cs@foxmail.com
博客: rustfisher.com | RustFisher cnblog
示例: AndroidTutorial Gitee, Tutorial Github
链接: https://www.an.rustfisher.com/android/io/file/read-write-json-file/
一家之言,仅当抛砖引玉。如有错漏,还请指出。