Android 存储 JSON 到 SD 卡

在 Android 开发中,经常需要将数据以 JSON 的形式存储到 SD 卡中。本文将介绍如何在 Android 应用中实现这一功能,并提供相关代码示例。

使用权限

在开始之前,我们需要在 AndroidManifest.xml 文件中添加适当的权限请求,以便应用可以访问 SD 卡。以下是所需的权限列表:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

检查 SD 卡状态

在存储 JSON 数据之前,我们需要检查 SD 卡的状态,以确保它已经挂载并可用。我们可以使用 Environment.getExternalStorageState() 方法来获取 SD 卡的状态。以下是一个示例方法来检查 SD 卡状态:

private boolean isExternalStorageAvailable() {
    String state = Environment.getExternalStorageState();
    return Environment.MEDIA_MOUNTED.equals(state);
}

创建 JSON 文件

一旦我们确定 SD 卡可用,我们可以创建一个新的 JSON 文件。为了实现这个功能,我们可以使用 FileOutputStreamOutputStreamWriter 类,如下所示:

private void createJsonFile(String fileName, String jsonString) {
    try {
        File file = new File(Environment.getExternalStorageDirectory(), fileName);
        FileOutputStream fos = new FileOutputStream(file);
        OutputStreamWriter osw = new OutputStreamWriter(fos);
        osw.write(jsonString);
        osw.flush();
        osw.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

以上代码将创建一个名为 fileName 的新文件,并将 jsonString 写入文件中。

读取 JSON 文件

如果我们想要读取 SD 卡上的 JSON 文件,我们可以使用 FileInputStreamInputStreamReader 类来实现。以下是一个读取 JSON 文件的示例方法:

private String readJsonFile(String fileName) {
    StringBuilder stringBuilder = new StringBuilder();
    try {
        File file = new File(Environment.getExternalStorageDirectory(), fileName);
        FileInputStream fis = new FileInputStream(file);
        InputStreamReader isr = new InputStreamReader(fis);
        BufferedReader bufferedReader = new BufferedReader(isr);
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            stringBuilder.append(line);
        }
        bufferedReader.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return stringBuilder.toString();
}

以上代码将读取名为 fileName 的文件,并将其内容以字符串的形式返回。

示例应用

以下是一个完整的示例应用,用于演示如何存储和读取 JSON 数据到 SD 卡中。

import android.Manifest;
import android.os.Bundle;
import android.os.Environment;

import androidx.appcompat.app.AppCompatActivity;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {

    private static final String PERMISSION_WRITE_EXTERNAL_STORAGE = Manifest.permission.WRITE_EXTERNAL_STORAGE;
    private static final String PERMISSION_READ_EXTERNAL_STORAGE = Manifest.permission.READ_EXTERNAL_STORAGE;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        requestPermissions(new String[]{PERMISSION_WRITE_EXTERNAL_STORAGE, PERMISSION_READ_EXTERNAL_STORAGE}, 0);

        if (isExternalStorageAvailable()) {
            String jsonString = "{ \"name\": \"John\", \"age\": 30 }";
            createJsonFile("data.json", jsonString);

            String jsonData = readJsonFile("data.json");
            System.out.println(jsonData);
        }
    }

    private boolean isExternalStorageAvailable() {
        String state = Environment.getExternalStorageState();
        return Environment.MEDIA_MOUNTED.equals(state);
    }

    private void createJsonFile(String fileName, String jsonString) {
        try {
            File file = new File(Environment.getExternalStorageDirectory(), fileName);
            FileOutputStream fos = new FileOutputStream(file);
            OutputStreamWriter osw = new OutputStreamWriter(fos);
            osw.write(jsonString);
            osw.flush();
            osw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private String readJsonFile(String fileName) {
        StringBuilder stringBuilder = new StringBuilder();
        try {
            File file = new File(Environment.getExternalStorageDirectory(), fileName);
            FileInputStream fis = new FileInputStream(file);
            InputStreamReader isr = new InputStreamReader(fis);
            BufferedReader bufferedReader = new BufferedReader(isr);
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                stringBuilder.append(line);
            }
            bufferedReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuilder.toString();
    }
}

以上示例应用通过调用 createJsonFile() 方法将 JSON 数据存储到名为 data.json 的文件中,然后通过调用 readJsonFile() 方法从该文件中读取 JSON 数据。