使用FileWriter保存TXT文件始终为空的Android开发问题求助
问题分析与解决方案
兄弟,我一眼就瞅到核心问题了——你用错了FileWriter的路径参数,导致内容根本没写到你指定的SD卡文件里!
问题根源拆解
你创建的plik对象是指向SD卡根目录的文件(比如/sdcard/test.txt),但调用FileWriter的时候,你传的是plik.getName()——这个方法只返回纯文件名(比如test.txt),而不是完整的SD卡路径。这时候FileWriter会默认把内容写到你的应用内部存储的根目录里,而不是你去查看的SD卡文件,所以你看到的SD卡文件自然是空的!
修复步骤
1. 修正FileWriter的路径参数
把plik.getName()换成plik对象本身,或者直接用完整路径字符串,两种写法都可以:
// 写法1:直接传入File对象(推荐,更安全) FileWriter wpis = new FileWriter(plik, true); // 写法2:传入完整路径字符串 FileWriter wpis = new FileWriter(plik.getAbsolutePath(), true);
2. 必须检查存储权限
安卓对外部存储的访问有严格限制,这也是常见的写入失败原因:
- Android 5.1及以下:在
AndroidManifest.xml里添加权限声明:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> - Android 6.0到9:除了Manifest声明,还要动态申请权限(比如在按钮点击前检查):
// 检查是否有写入权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // 申请权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 100); } - Android 10及以上:直接写
/sdcard路径会受Scoped Storage限制,建议改用公共文档目录:File plik = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS), nazwa + ".txt");
3. 优化流的关闭逻辑(避免写入丢失)
可以用Java的try-with-resources语法,自动关闭流,防止因为忘记关闭导致内容没写入磁盘:
try (FileWriter wpis = new FileWriter(plik, true); BufferedWriter bufor = new BufferedWriter(wpis)) { bufor.write(e_magazyn.getText().toString()); // 建议加个换行,不然每次写入的内容会连在一起 bufor.newLine(); i_e_magazyn.setText(e_magazyn.getText().toString()); } catch (IOException e) { // 给用户提示错误,别只打印日志 Toast.makeText(getApplicationContext(), "写入失败:" + e.getMessage(), Toast.LENGTH_SHORT).show(); e.printStackTrace(); }
额外排查点
- 去系统设置的应用权限里,确认你的应用已经拿到了存储权限
- 如果是Android 11+,不要直接操作
/sdcard根目录,改用系统提供的公共目录或者应用专属外部存储
内容的提问来源于stack exchange,提问作者Menalk
相关产品推荐
相关产品推荐

