【问题标题】:FileNotFoundException while opening a file that exists?打开存在的文件时出现 FileNotFoundException?
【发布时间】:2013-06-05 10:03:25
【问题描述】:

我使用了一个文件:

FileOutputStream fos = app.openFileOutput("FileOne.txt", Context.MODE_APPEND);

稍后在同一个程序中,我尝试使用以下命令打开此文件:

PrintWriter writer = new PrintWriter(context.getFileStreamPath("FileOne.txt"));

但这样做会在 LogCat 中给出此异常:

06-05 09:49:32.230: D/error155 java.lang.RuntimeException: File not found(7707): [ 06-05 09:49:32.240  7707: 7736 D/ java.io.FileNotFoundException: /FileOne.txt: open failed: EROFS (Read-only file)

我检查了内部存储,文件确实存在。如何正确打开文件?

【问题讨论】:

  • 你把错误信息读到最后了吗?该文件是 ro
  • 或者为什么File API 很烂。如果您使用 Java 7,请帮自己一个忙并使用新的 Files API。 FileNotFoundException 如果文件存在但您没有尝试执行操作的必要凭据,也会抛出此错误!
  • 首先通过简单的方式检查文件 File file = new File(path);文件已存在();可能是您提供的路径不同。还要检查 file.read() 和 file.write() 权限
  • 为什么不为文件定义一个路径并使用该路径打开它?
  • @fge - 操作系统在标签中指定,最终比语言是 Java 更重要。 java.nio.files 可用。

标签: java android file-io


【解决方案1】:

文件文件 = 新文件(你的路径);

//首先使用以下语句确保文件存在于提供的路径上:

file.exists();

检查文件权限是否允许:

file.canExecute(); – return true, file is executable; false is not.
file.canWrite(); – return true, file is writable; false is not.
file.canRead(); – return true, file is readable; false is not.

设置文件权限:

file.setExecutable(boolean); – true, allow execute operations; false to disallow it.
file.setReadable(boolean); – true, allow read operations; false to disallow it.
file.setWritable(boolean); – true, allow write operations; false to disallow it.

【讨论】:

  • 这只是部分解决了它。现在相同的代码有时可以工作,有时会抛出异常!
  • @vergilcorleone - 这是一个毫无意义的回复。您做了哪些更改,这些查询在工作和非工作案例中报告了什么状态?
  • @ChrisStratton 使用file.setReadable(true); 会导致异常抛出异常。这意味着有时代码可以正常工作而没有任何错误(即正在读取文件),有时它会抛出异常。
  • file.exists() 报告什么?
  • @ChrisStratton file.exists() 报告为真
【解决方案2】:

文件可以找到,但它是只读的

open failed: EROFS (Read-only file)

FileNotFoundException 名称具有误导性

【讨论】:

  • 好点。但是,我想知道它是否实际上是只读的(人们不希望由于遗漏而发生这种情况),或者它是否由于上一次调用已经以写入模式打开而被锁定?
【解决方案3】:

此文件创建于:您的根目录,我认为该文件不可读。

所以提供一个路径,在指定目录中创建任何文件:

编辑:

FileOutputStream fos = app.openFileOutput(Environment.getExternalStorageDirectory() + File.separator +"FileOne.txt", Context.MODE_APPEND);

【讨论】:

  • 这与提出的问题有什么关系?
  • 您能否详细说明使用您的语法会有什么不同?
  • @TusharPandey - 不正确,文件未在根目录中创建。相反,Android 文档说它是在应用程序私有目录的适当位置创建的。
【解决方案4】:

在以下情况下也会引发此异常:

  • 文件实际上是一个文件夹。
  • 如果您没有访问文件的必要权限

更改此文件的权限以打开它(chmod 777 FileOne.txt)

编辑:

如果是安卓应用,在manifest中添加如下权限:

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

【讨论】:

  • 感谢您的回答。如何获得写权限?
  • 您使用的是什么操作系统? Windows、Linux、MAC?
  • 这实际上是一个 android 应用程序,但我在 Windows 7 中编码。
  • 好的,如果是android,把这个权限添加到Manifest:
  • -1 用于建议文件模式 777。不要使东西既可执行又全局可写!
猜你喜欢
  • 2014-02-03
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
  • 2014-12-21
  • 1970-01-01
相关资源
最近更新 更多