Android FileOutputStream return api 级别 22 中的 FileNotFoundException
Android FileOutputStream return FileNotFoundException in api level 22
我正在尝试从服务器下载 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()
中使用的那样。
我正在尝试从服务器下载 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()
中使用的那样。