You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android开发:如何向已有文本文件追加内容?

Android 追加文本到SD卡文件的实现方法

嘿,作为Android新手能自己动手练项目真的超赞!刚好我之前也处理过类似需求,给你一步步讲清楚怎么实现,还要提醒你注意那些容易踩坑的点~

一、先搞定存储权限

访问SD卡文件必须先申请权限,不同Android版本的权限处理逻辑略有不同:

  1. AndroidManifest.xml里声明静态权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- Android 10+ 如需直接访问根目录文件,可添加这个权限(练手场景适用) -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:minSdkVersion="30" />
  1. Android 6.0(API 23)及以上要动态申请权限
    因为系统会弹出权限申请弹窗,用户同意后才能操作文件,写个工具方法来处理:
private void requestStoragePermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
            != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                100);
    } else {
        // 权限已获取,直接执行追加操作
        appendTextToFile();
    }
}

// 处理权限申请结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 100) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            appendTextToFile();
        } else {
            Toast.makeText(this, "需要存储权限才能写入文件哦", Toast.LENGTH_SHORT).show();
        }
    }
}

二、核心:实现追加文本的代码

接下来写appendTextToFile()方法,关键是用FileWriter时传入第二个参数true,表示追加模式(不传的话默认是覆盖原文件),再配合\n实现新行追加:

private void appendTextToFile() {
    // 目标文件路径
    String filePath = Environment.getExternalStorageDirectory() + "/android.txt";
    // 要追加的文本,加\n就是新行开头
    String textToAppend = "\nIt is awesome";

    // 用try-with-resources自动关闭流(Android API 19+支持,更简洁)
    try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath, true))) {
        writer.write(textToAppend);
        Toast.makeText(this, "文本追加成功!", Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        e.printStackTrace();
        Toast.makeText(this, "写入失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
    }
}

如果你的项目兼容更低版本,也可以用传统的finally手动关流:

private void appendTextToFile() {
    String filePath = Environment.getExternalStorageDirectory() + "/android.txt";
    String textToAppend = "\nIt is awesome";
    BufferedWriter writer = null;

    try {
        writer = new BufferedWriter(new FileWriter(filePath, true));
        writer.write(textToAppend);
        Toast.makeText(this, "文本追加成功!", Toast.LENGTH_SHORT).show();
    } catch (IOException e) {
        e.printStackTrace();
        Toast.makeText(this, "写入失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
    } finally {
        try {
            if (writer != null) {
                writer.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

三、额外的避坑提醒

  • 先检查SD卡是否可用:调用追加方法前,可以先判断存储状态,避免SD卡未挂载时报错:
private boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    return Environment.MEDIA_MOUNTED.equals(state);
}
  • Android 10+ 分区存储问题:如果你的目标SDK是29及以上,默认不能直接访问SD卡根目录,练手的话可以在AndroidManifest.xml<application>标签里加android:requestLegacyExternalStorage="true"临时绕过;如果是正式项目,建议改用MediaStore API来处理文件。

内容的提问来源于stack exchange,提问作者user9424533

火山引擎 最新活动