尝试在Android中创建文件:打开失败:EROFS(只读文件系统)

问题描述 投票:46回答:7

这一行:

final FileOutputStream outputStream = new FileOutputStream(name);

导致FileNotFoundException,消息为/2ozjfFQzwv: open failed: EROFS (Read-only file system),其中“2ozjfFQzwv”是我传递的文件名。

无论是否有WRITE_INTERNAL_STORAGE许可,我都试过这个。如何创建此文件进行编写?

或者,我只是希望能够为新活动提供图像,并且它太大而无法将其序列化。有没有比将其写入文件然后再次从中读取更简单的方法?这里的所有问题似乎都是关于写入SD卡,我不想这样做,因为很多人没有SD卡插槽。

android file file-io filesystems android-file
7个回答
84
投票

我在使用和不使用WRITE_INTERNAL_STORAGE权限的情况下尝试过此操作。

Android中没有WRITE_INTERNAL_STORAGE权限。

如何创建此文件进行编写?

如果您的应用程序以超级用户权限运行,则除了根设备之外,您不会这样做。您正在尝试写入内部存储的根目录,哪些应用程序无权访问。

请使用带有FileOutputStream对象的File构造函数的版本。根据您可以写入的某个位置创建该File对象,例如:

  • getFilesDir()(拜访你的Activity或其他Context
  • getExternalFilesDir()(拜访你的Activity或其他Context

后者将需要WRITE_EXTERNAL_STORAGE作为许可。

有没有比将其写入文件然后再次从中读取更简单的方法?

您可以暂时将其放在静态数据成员中。

因为很多人没有SD卡插槽

总的来说,“SD卡插槽”无关紧要。 99%的Android设备用户将拥有外部存储设备 - 例外情况将是用户移除SD卡的4年以上设备。自2010年中期开始生产的设备将外部存储作为板载闪存的一部分,而不是可移动介质。


17
投票

尝试使用WRITE_EXTERNAL_STORAGE的许可你应该使用它是否有外部卡。

这适合我:

path = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_MOVIES);
File file = new File(path, "/" + fname);

并将我的文件放在适当的文件夹中


5
投票

添加

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

在清单中使用和使用相同的马丁:

path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES); 
File file = new File(path, "/" + fname);

有效。


5
投票

这是来自android developer的简单样本。

基本上,您可以在内部存储中写入一个文件,如下所示:

String FILENAME = "hello_file";
String string = "hello world!";

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();

2
投票

正如其他人所提到的,Android上的应用程序无法将文件写入内部存储的任何文件夹,而是自己的私有存储(位于/ data / data / PACKAGE_NAME下)。

您应该使用API​​来获取应用程序允许的正确路径。

this


0
投票

Google限制了对外部SD卡的写入权限。从API 19开始,有一个名为Storage Access Framework的框架,它允许您设置“合同”以允许写访问。

有关详细信息:

Android - How to use new Storage Access Framework to copy files to external sd card


0
投票

如果有人在单元/仪器测试中得到这个,请确保在应用程序上下文中调用getFilesDir(),而不是测试上下文。即使用:

Context appContext = getInstrumentation().getTargetContext().getApplicationContext();

Context appContext = InstrumentationRegistry.getContext;
© www.soinside.com 2019 - 2024. All rights reserved.