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

Dre*_*rew 54 filesystems file-io android file android-file

这一行:

final FileOutputStream outputStream = new FileOutputStream(name);
Run Code Online (Sandbox Code Playgroud)

结果FileNotFoundException是消息是/2ozjfFQzwv: open failed: EROFS (Read-only file system)"2ozjfFQzwv"是我传递的文件名.

我在没有得到WRITE_INTERNAL_STORAGE许可的情况下尝试了这个.如何创建此文件进行编写?

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

Com*_*are 84

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

WRITE_INTERNAL_STORAGEAndroid中没有权限.

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

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

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

  • getFilesDir()(打电话给你Activity或其他人Context)
  • getExternalFilesDir()(打电话给你Activity或其他人Context)

后者需要WRITE_EXTERNAL_STORAGE作为许可.

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

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

因为很多人没有SD卡插槽

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

  • @PawełParadowski:所有Nexus系列设备都有外部存储设备.他们没有可移动存储空间.外部存储并不意味着可移动存储. (12认同)
  • 为getFilesDir()+1,谢谢你`new BufferedWriter(new FileWriter(getFilesDir()+ FILENAME));` (5认同)

Mar*_*tin 17

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

这适合我:

path = Environment.getExternalStoragePublicDirectory(
                Environment.DIRECTORY_MOVIES);
File file = new File(path, "/" + fname);
Run Code Online (Sandbox Code Playgroud)

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

  • `从 API 级别 19 开始,读取/写入 getExternalFilesDir(String) 和 getExternalCacheDir() 返回的特定于应用程序的目录中的文件不需要此权限。` https://developer.android.com/reference/android/Manifest.permission.html#WRITE_EXTERNAL_STORAGE (2认同)

小智 5

这是Android开发人员的简单示例.

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

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

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
Run Code Online (Sandbox Code Playgroud)


nob*_*_tq 5

添加

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)

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

path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES); 
File file = new File(path, "/" + fname);
Run Code Online (Sandbox Code Playgroud)

有效.

  • 来自dev.android:但是,如果您的应用使用WRITE_EXTERNAL_STORAGE权限,则它也隐式拥有读取外部存储的权限. (3认同)