【问题标题】:File not found exception when writing away file in java (android)在java(android)中写掉文件时找不到文件异常
【发布时间】:2026-02-07 19:40:01
【问题描述】:

我在 android 中保存文件时遇到问题,FileOutputStream 不断退回到FileNotFoundException,因此不会将文件写入外部存储。

是的,我确实在清单中设置了权限:

uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"

我已经在函数下面添加了代码,有人可以向我解释发生了什么问题,如果它试图覆盖现有文件,有没有办法替换该文件(名称需要是静态的)?

(也欢迎提供使代码看起来更好的提示)

Bitmap savebitmap = Bitmap.createBitmap(drawView.getDrawingCache());
File mediaStorageDir = new File(Environment.getExternalStorageDirectory()+"/Android/data/"+getApplicationContext().getPackageName()+"/Files");

if (!mediaStorageDir.exists()){
    mediaStorageDir.mkdir();
}

File pictureFile = new File(Environment.getExternalStorageDirectory()+"/Android/data/"+getApplicationContext().getPackageName()+"/Files"+File.separator+"Tempsave.png");

try {
    FileOutputStream fos = new FileOutputStream(pictureFile);
    savebitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
    fos.flush();
    fos.close();

}
catch (FileNotFoundException e) {}
catch (IOException e) {}

感谢 Guillaume 和 theV0ID 引导我找到最有效的正确答案。 下面是编辑为工作版本的示例代码。

Bitmap savebitmap = Bitmap.createBitmap(drawView.getDrawingCache());

File pictureFile = new File(Environment.getExternalStorageDirectory()+"/Android/data/"+getApplicationContext().getPackageName()+"/Files"+File.separator+"Tempsave.png");

pictureFile.getParentFile().mkdirs();

try {
    FileOutputStream fos = new FileOutputStream(pictureFile);
    savebitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
    fos.flush();
    fos.close();
}
catch (FileNotFoundException e) {}
catch (IOException e) {}

【问题讨论】:

  • 请创建最小示例来重现问题。
  • @theV0ID 创建一个最小示例是什么意思?减少代码,只保留书写部分?此外,如果尝试加载文件有帮助,则会出现文件/文件夹不存在的错误。
  • 我的意思是你应该删除代码中明显与问题无关的部分。
  • @theV0ID 我已按要求删除了与文件输出流无关的所有内容
  • 这不是一个最小的例子。您仍然有大量不相关的代码。位图压缩显然是不相关的,你也可以简化你的路径。但是,你检查过mediaStorageDir.mkdir() 的返回值吗?如果必须为真true。如果不是,则实际问题出在之前的某个地方。您是否检查过mediaStorageDir 的计算是否正确?您可以在调试器中查看或打印 mediaStorageDir.toString() 以记录 cat。

标签: java android file bitmap filenotfoundexception


【解决方案1】:

试试这个:

File pictureFile = new File(Environment.getExternalStorageDirectory()+"/Android/data/"+getApplicationContext().getPackageName()+"/Files"+ File.separator + "Tempsave.png");

pictureFile.getParentFile().mkdirs();

如果文件目录不存在,您需要创建它们。如果不是 FileOutputStream 将抛出 FileNotFoundException

【讨论】:

  • 这确实有效,出于某种原因,我希望文件输出流自己创建它,非常感谢
  • 这是错误的。如果文件不存在,FileOutputStream 将创建该文件。它不会当且仅当它无法创建时,因为documented here 关键是需要创建目录
  • @theV0ID 实际上唯一需要的就是图片文件.getParentFile().mkdirs();