openFileOutput出现FileNotFoundException

26

这是我本周的新手问题。我更关心的是一般性的推测,而不是具体的代码,并且希望Android的开发人员能够看到并纠正:

Context.openFileOutput的SDK文档说:

打开一个与该Context应用程序包相关联的私有文件进行写入。如果文件不存在,则创建该文件。

好的,听起来很不错。我可以创建一个文件。除了这个方法还会抛出FileNotFoundException,所以显然有些问题。为什么一个函数“应该”在找不到文件时创建文件却抛出异常呢?

有点违背了那整个“创建文件...”的意义,不是吗?


你提供给 openFileOutput() 的路径是什么? - CommonsWare
2
你能运行调试器并检查你的FileNotFoundException的detailMessage吗?你不能在方法调用中使用文件分隔符(文档中已经说明,在这种情况下,detailMessage是“文件[...]包含路径分隔符”)。 - guido
4个回答

29

我必须为此事未经仔细查看就贸然行动而道歉。在阅读文档时,我有些惊慌失措。经过一些测试,我发现openFileOutput()确实像宣传的那样运作,并且在文件不存在时创建文件,而不是像我担心的那样仅仅抛出FnF异常。显然,FnF异常是为了处理Activity应用程序目录不存在的情况而添加的。

再次感到抱歉,但希望这可能会帮助其他对文档感到困惑的人。


2
如果有权限问题阻止文件被创建/打开,也会抛出FileNotFoundException。 - Matt Connolly
4
那么为什么它被称为“FileNotFoundException”呢? - Pacerier
2
openFileOutput 声明仅抛出该异常。我不知道为什么他们在其他情况下选择不抛出更合适的异常。http://developer.android.com/reference/android/content/Context.html#openFileOutput(java.lang.String,%20int) - Matt Connolly
我现在遇到的另一个问题是,在私有文件创建模式下,当文件不存在时,它会抛出一个Mono.Android异常“不支持该操作”。你遇到过这种情况吗? - ForceMagic
我相信如果存在同名的目录,则会抛出FileNotFoundException,从而无法创建文件。是的,这个名称有些误导性。 - pimmhogeling

1

FileNotFoundException是一种异常,当您尝试写入不存在或当前无法访问的文件时抛出。还有什么其他情况会发生这种情况?

  • 也许您忘记关闭文件并尝试打开同一个文件。
  • 也许您尝试创建指向同一文件的多个FileOutputStream对象。

这些都会导致FileNotFoundException。

无论如何,您可以在调用openFileOutput(以及调用此函数的其他函数)的函数声明末尾插入throws FileNotFoundException


1

如果您使用MODE_APPEND追加到现有文件,但该文件不存在,则可能会引发此异常。


-4

3
这个权限是针对外部存储的;openFileOutput() 是针对内部存储的。 - CommonsWare
@CommonsWare 如果是这样,那么我们需要什么权限才能写入内部存储...? - edthethird
@edthethird: 写入内部存储空间不需要权限。 - CommonsWare
K,谢谢。我肯定还有其他错误。每次更新时,我都会得到这个错误,而不仅仅是在第一次更新时出现(应该创建文件)。 - edthethird

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接