Android Studio如何保存文本到指定路径并解决openFileOutput相关报错
错误原因说明
Cannot resolve method 'openFileOutput':openFileOutput()是AndroidContext类独有的方法,仅能在Activity、Service等Context子类内部直接调用,若代码写在普通类中,或未持有Context实例则无法识别。Cannot resolve symbol 'MODE_PRIVATE':MODE_PRIVATE同样是Context类定义的常量,脱离Context环境无法直接引用。
此外你当前用的openFileOutput方法仅能将文件写入App私有目录(路径为/data/data/[你的应用包名]/files/),无法实现存储到公共Download目录的需求,因此不需要再使用这套API,直接用Java标准文件IO即可解决报错+满足需求。
前置配置
首先在AndroidManifest.xml中添加存储权限声明:
<!-- Android 12及以下版本需要 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
Android 6.0及以上版本需要在代码中动态申请存储权限,权限申请通过后再执行文件写入逻辑。
实现代码
以下代码实现将时间戳更新到文件首行、文件写入公共Download目录的需求,同时规避了原来的两个报错:
import android.os.Environment; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; public void saveFile() { // 所有IO操作放在子线程执行,避免阻塞主线程 new Thread(() -> { // 指定存储路径为公共Download目录 File downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File targetFile = new File(downloadDir, "my_file.txt"); FileOutputStream fos = null; BufferedReader br = null; while (true) { try { // 读取原有文件内容 StringBuilder oldContent = new StringBuilder(); if (targetFile.exists()) { br = new BufferedReader(new FileReader(targetFile)); String line; while ((line = br.readLine()) != null) { oldContent.append(line).append("\n"); } br.close(); } // 拼接新内容到首行 String finalContent = System.currentTimeMillis() + "\n" + oldContent; // 写入文件,false代表覆盖原文件,实现首行更新 fos = new FileOutputStream(targetFile, false); fos.write(finalContent.getBytes()); fos.flush(); // 按需设置更新间隔,避免占用过多CPU Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); break; // 出错后终止循环,避免持续抛异常 } finally { // 关闭流资源 try { if (fos != null) fos.close(); if (br != null) br.close(); } catch (IOException e) { e.printStackTrace(); } } } }).start(); }
适配高版本Android说明
Android 10(API 29)及以上版本对公共目录读写做了限制,如需适配可以使用MediaStoreAPI或者存储访问框架(SAF)实现公共目录文件写入。
内容的提问来源于stack exchange,提问作者Sleepy
相关产品推荐
相关产品推荐

