gpt4 book ai didi

Android FileOutputStream 在 api 级别 22 中返回 FileNotFoundException

转载 作者:行者123 更新时间:2023-11-29 00:03:52 25 4
gpt4 key购买 nike

我正在尝试从服务器下载 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。哪里出了问题?我该如何解决这个问题?

最佳答案

before calling FileOutputStream() i am calling this public void createDirectory() { File directory = new File(getFilesDir() + "/training"); if (!directory.exists()) { directory.mkdir(); } }

那不是你要写文件的地方:

String root = Environment.getExternalStorageDirectory().toString(); String path = path = "/training/training.pdf"; String fileName = fileName=root+"/"+getFilesDir()+path;

如您所见,这些不匹配。


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

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

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

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

关于Android FileOutputStream 在 api 级别 22 中返回 FileNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41058799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com