跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Android Studio 将字符串写入本地文件的操作方法

Android 开发中通过 Java 代码操作文件系统,实现字符串内容追加或覆盖写入本地。涉及权限动态申请、IO 流使用(BufferedWriter/FileWriter)、文件读取与删除。需注意 Android 6.0+ 权限机制及 Scoped Storage 存储策略变化,推荐优先使用应用私有目录以确保兼容性。

DataScient发布于 2025/2/7更新于 2026/10/25107 浏览
Android Studio 将字符串写入本地文件的操作方法

Android Studio 将字符串写入本地文件的操作方法

在 Android 应用开发中,经常需要将用户输入的数据或程序生成的日志保存到设备本地。本文将详细介绍如何在 Android Studio 中使用 Java 语言,通过 IO 流操作将字符串写入本地文件(包括 SD 卡及内部存储),并涵盖权限申请、文件读取与删除的完整流程。

一、权限配置与动态申请

从 Android 6.0 (API Level 23) 开始,系统引入了运行时权限机制。对于读写外部存储(SD 卡)的操作,除了需要在 AndroidManifest.xml 中声明权限外,还需要在代码中进行动态申请。

1. Manifest 声明

在 AndroidManifest.xml 中添加以下权限:

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

注意:在 Android 10 (API Level 29) 及以上版本,由于作用域存储(Scoped Storage)的限制,直接访问公共目录的方式受到限制。建议优先使用应用私有目录,若必须访问公共目录,请确保符合相关规范。

2. 运行时权限检查

在 Activity 中实现权限检查逻辑。以下代码展示了如何判断权限状态并在需要时发起请求。

private static final int CODE_READ_SMS = 1001;
private static final String TAG = "FileIOExample";

private void checkPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 6.0 以上
        int permissionWrite = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
           ActivityCompat.checkSelfPermission(, Manifest.permission.READ_EXTERNAL_STORAGE);
        
         (permissionWrite != PackageManager.PERMISSION_GRANTED && permissionRead != PackageManager.PERMISSION_GRANTED) {
            Log.e(TAG, );
            
             (ActivityCompat.shouldShowRequestPermissionRationale(, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                Log.e(TAG, );
                
                ActivityCompat.requestPermissions(,
                         []{Manifest.permission.WRITE_EXTERNAL_STORAGE}, CODE_READ_SMS);
            }  {
                Log.e(TAG, );
                Toast.makeText(MainActivity., , Toast.LENGTH_SHORT).show();
            }
        }  {
            Log.e(TAG, );
            
        }
    }  {
        Log.e(TAG, );
    }
}


   {
    .onRequestPermissionsResult(requestCode, permissions, grantResults);
     (requestCode == CODE_READ_SMS) {
         (grantResults.length >  && grantResults[] == PackageManager.PERMISSION_GRANTED) {
            Log.e(TAG, );
        }  {
            Log.e(TAG, );
            Toast.makeText(MainActivity., , Toast.LENGTH_SHORT).show();
        }
    }
}
int
permissionRead
=
this
if
"没有获取权限,请申请"
// 判断是否需要显示解释对话框
if
this
"提示用户"
// 这里可以弹出一个 Dialog 向用户解释为什么要申请权限
this
new
String
else
"您已禁止"
this
"没有获取读取手机权限,请到应用中心手动打开该权限"
else
"获取到了权限"
// 权限已授予,执行后续操作
else
"低版本系统默认获取到了权限"
@Override
public
void
onRequestPermissionsResult
(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)
super
if
if
0
0
"获取到了权限"
else
"没有获取到权限"
this
"权限被拒绝,功能不可用"

二、文件写入操作

Android 提供了多种 IO 类用于文件写入,常用的有 BufferedWriter 和 FileWriter。两者都支持追加模式。

1. 使用 BufferedWriter 追加内容

BufferedWriter 效率较高,适合大量文本写入。构造参数中的第二个布尔值控制是覆盖还是追加。

public void saveToFile(String content) {
    BufferedWriter out = null;
    try {
        // 获取 SD 卡状态
        String state = Environment.getExternalStorageState();
        // 判断 SD 卡是否就绪
        if (!Environment.MEDIA_MOUNTED.equals(state)) {
            Toast.makeText(this, "请检查 SD 卡", Toast.LENGTH_SHORT).show();
            return;
        }
        
        // 取得 SD 卡根目录
        File file = Environment.getExternalStorageDirectory();
        Log.e(TAG, "======SD 卡根目录:" + file.getCanonicalPath());
        
        // 构建文件路径
        String filePath = file.getCanonicalPath() + "/readMsg.txt";
        
        /*
         * FileOutputStream 构造参数 2: true= 追加内容;false= 覆盖内容
         */
        out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath, true), "UTF-8"));
        out.newLine();
        out.write(content);
        Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();
        
    } catch (IOException e) {
        e.printStackTrace();
        Toast.makeText(this, "保存失败", Toast.LENGTH_SHORT).show();
    } finally {
        if (out != null) {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

2. 使用 FileWriter 追加内容

FileWriter 封装了字符编码转换,使用更简便,但性能略低于 BufferedWriter。

/**
 * 使用 FileWriter 进行文本内容的追加
 * @param file 目标文件对象
 * @param content 待写入的内容
 */
private void addTxtToFileWrite(File file, String content) {
    FileWriter writer = null;
    try {
        // FileWriter(file, true), 第二个参数为 true 是追加内容,false 是覆盖
        writer = new FileWriter(file, true);
        writer.write("\r\n"); // 换行符
        writer.write(content);
        writer.flush(); // 确保数据写入磁盘
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if (writer != null) {
                writer.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

最佳实践建议:在现代 Android 开发中,推荐使用 Context.getFilesDir() 或 Context.getExternalFilesDir(null) 来存储应用私有数据。这些目录不需要额外的存储权限,且受系统保护,不会被其他应用随意访问。

三、文件读取操作

读取文件时建议使用字符流(如 BufferedReader),以正确处理中文等 Unicode 字符。

// 从指定路径读取文件
public String readFromFile(String filePath) {
    BufferedReader reader = null;
    StringBuilder sbd = new StringBuilder();
    
    try {
        File file = new File(filePath);
        if (!file.exists()) {
            Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
            return "";
        }
        
        FileInputStream fis = new FileInputStream(file);
        // 指定 UTF-8 编码避免乱码
        reader = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
        String row;
        while ((row = reader.readLine()) != null) {
            sbd.append(row).append("\n");
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return sbd.toString();
}

四、文件删除操作

删除文件前需先检查文件是否存在,并处理可能的异常。

// 删除 SD 卡文件
public void removeFromFile(String fileName) {
    String state = Environment.getExternalStorageState();
    if (!Environment.MEDIA_MOUNTED.equals(state)) {
        Toast.makeText(this, "SD 卡未就绪", Toast.LENGTH_SHORT).show();
        return;
    }
    
    // 取得 SD 卡根目录
    File root = Environment.getExternalStorageDirectory();
    File myFile = new File(root, fileName);
    
    if (myFile.exists()) {
        boolean deleted = myFile.delete();
        if (deleted) {
            Toast.makeText(this, "文件已删除", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "删除失败", Toast.LENGTH_SHORT).show();
        }
    } else {
        Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
    }
}

五、总结与注意事项

本文详细介绍了 Android Studio 中将字符串写入本地文件的基本操作方法,涵盖了权限管理、IO 流的使用以及文件的增删改查。

  1. 权限安全:务必处理好 Android 6.0+ 的动态权限申请,否则会导致 SecurityException。
  2. 编码格式:读写文件时显式指定 UTF-8 编码,防止中文乱码。
  3. 存储路径:随着 Android 版本迭代,外部存储权限逐渐收紧。建议在新项目中优先使用应用私有目录(Internal Storage),仅在必要时才申请外部存储权限。
  4. 资源关闭:所有 IO 流操作后必须在 finally 块中关闭流,或使用 try-with-resources 语法,防止内存泄漏。
  5. 线程安全:IO 操作属于耗时操作,严禁在主线程(UI 线程)中执行,应放入子线程或使用异步任务处理,以免导致 ANR(Application Not Responding)。

通过上述方法,开发者可以稳健地实现数据的本地持久化存储。

目录

  1. Android Studio 将字符串写入本地文件的操作方法
  2. 一、权限配置与动态申请
  3. 1. Manifest 声明
  4. 2. 运行时权限检查
  5. 二、文件写入操作
  6. 1. 使用 BufferedWriter 追加内容
  7. 2. 使用 FileWriter 追加内容
  8. 三、文件读取操作
  9. 四、文件删除操作
  10. 五、总结与注意事项

更多推荐文章

查看全部
  • 大模型微调技术详解:从原理到实践
  • Android 休眠机制详解
  • Linux 下 C++ 线程池设计与实现
  • GitHub Copilot:Python 开发者的 AI 助手
  • Faster-Whisper 本地实时语音转文本部署指南
  • 微软发布 Phi-3-vision 多模态模型:42 亿参数展现小模型大潜力
  • 使用 IDEA 社区版从零开始创建第一个 SpringBoot 程序
  • 嵌入式 C/C++ 核心知识点整理
  • Git 入门实战:从零理解版本控制与团队协作
  • 使用 OpenClaw 和飞书搭建 7x24 小时服务器运维机器人
  • 牛客 NC221681 dd 爱框框:滑动窗口解法详解
  • 宇树 G1 人形机器人强化学习训练实战指南
  • GitHub Copilot 四种模式区别:Agent、Ask、Edit、Plan
  • Java Map 常用方法与核心实现类深度解析
  • OpenClaw 配置飞书机器人与 Kimi 2.5 接入指南
  • JavaScript 中 $(function(){}) 的含义解析
  • Java 随机数生成实战:范围字符串解析与动态区间控制
  • PyCharm 编写 Python 程序完整教程
  • 40 个 Python 可视化图表案例及代码实现
  • 大语言模型入门指南:原理、类型与应用

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online