【问题标题】:Android FileOutputStream return FileNotFoundException in api level 22Android FileOutputStream 在 api 级别 22 中返回 FileNotFoundException
【发布时间】:2023-03-18 08:08:01
【问题描述】:

我正在尝试从服务器下载 pdf 文件。我为此写了一些代码。它适用于 api 级别 21 和 >=23,但不适用于 api 22。这是问题所在:

OutputStream output = new FileOutputStream(fileName);
byte data[] = new byte[1024];

while ((count = input.read(data)) != -1) {
   output.write(data, 0, count);
}

但是当它尝试执行时

 OutputStream output = new FileOutputStream(fileName); 

它显示

java.io.FileNotFoundException: /storage/emulated/0/data    /data/com.example.test/files/training/training.pdf: open failed: ENOENT (No such file or directory)

这适用于 api 级别 21 和 23。出了什么问题?我该如何解决这个问题?

【问题讨论】:

  • 你在AndroidManifest.xml文件中给<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />权限了吗?
  • 当然。它还在 api 21 和 23 上工作
  • 请在获取文件之前检查它是否存在然后尝试读取。你可以查看stackoverflow.com/questions/16237950/…
  • 来自 Android 开发者控制台 FileNotFoundException 在“如果文件存在但为目录而非常规文件、不存在但无法创建或因任何其他原因无法打开”时发生。这意味着如果文件不存在,它将创建新文件
  • 你传递给 FileOutputStream() 构造函数的文件名是什么?

标签: android fileoutputstream android-download-manager


【解决方案1】:

在调用 FileOutputStream() 之前,我调用了这个 public void createDirectory() { File directory = new File(getFilesDir() + "/training"); if (!directory.exists()) { directory.mkdir(); } }

这不是您尝试写入文件的位置:

字符串根 = Environment.getExternalStorageDirectory().toString();字符串路径 = 路径 = "/training/training.pdf";字符串文件名 = 文件名=root+"/"+getFilesDir()+path;

如您所见,这些不匹配。


如果您想要external storage 上的文件,最好的解决方案是摆脱所有这些并使用getExternalFilesDir(),调用Context(类似于getFilesDir())。这给了你:

  • 独一无二的目录
  • 在外部存储上
  • 卸载您的应用时文件将被删除的位置
  • 在 Android 4.4+ 上不需要权限

外部存储的下一个最佳解决方案是摆脱所有这些并使用Environment.getExternalStoragePublicDirectory() 作为您的基础,根据文件的类型(例如照片、视频、音乐)将文件放在标准位置。这些文件将在卸载后继续存在,并且此位置将需要 WRITE_EXTERNAL_STORAGE。此外,您必须自己在此根目录下创建一个唯一的子目录,但通常这是通过用户友好的显示名称(例如,OpenCamera)而不是包名称来完成的。

您在createDirectory() 中创建的目录非常好,但它是internal storage,因此用户无法访问它。如果您想使用它,请使用相同的算法为您的FileOutputStream 创建File,就像您在createDirectory() 中使用的一样。

【讨论】:

  • 非常感谢。我正在从根文件夹中读取文件。没有必要。现在我正在使用 getFilesDir() 方法,问题就解决了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 2017-01-01
相关资源
最近更新 更多