【发布时间】:2015-11-12 09:55:07
【问题描述】:
我知道这里有很多关于 java.io.IOException: write failed: EBADF (Bad file number) 异常的帖子,但似乎没有一个回答我的特定问题:
假设我的活动是用Intent.ACTION_VIEW 调用的,我通过Uri uri = intent.getData() 得到了一个Uri,它以content:// 开头,我从中读取了一些数据(例如pdf 文件)。现在我想知道我是否也可以写信给Uri 来决定是应该向用户显示“保存”按钮,还是只显示“另存为”按钮。
进一步假设我可以先成功打开一个ParcelFileDescriptor,最后是一个FileOutputStream,如
ParcelFileDescriptor pfd = context.getContentResolver().openFileDescriptor(uri, "w");
FileOutputStream fileOutputStream = new FileOutputStream(pfd.getFileDescriptor());
这样fileOutputStream != null。
根据Uri,现在可能会发生,如果我尝试写信给fileOutputStream,我会得到异常:
Exception=java.io.IOException: write failed: EBADF (Bad file number)
我想提前知道这是否会在不实际接触/更改文件的情况下发生。有人会认为,在尝试之前应该可以确定我是否可以写信给给定的Uri。
我怎样才能做到这一点?
补充意见:
我想当我无权写入该特定文件/uri时会发生上述情况,但是为什么Android首先让我打开FileOutputStream?
为了测试,我在 ICS 设备上使用 Kaiten 邮件收到的电子邮件中的附件。如果我在 Kaiten 邮件中单击“保存”uri 匹配 content://media/external/file/[0-9]* 后打开我的应用程序并且一切正常,但是如果我单击“打开”uri 匹配 content://com.kaitenmail.attachmentprovider/[-0-9a-f]*/[0-9]*/VIEW 并且遇到上述错误。
【问题讨论】:
-
public static StructStat android.system.Os#fstat(FileDescriptor fd)呢?我知道它的 API 21... -
看起来这可能是一个一般的解决方案,但我需要这个工作到 API 14...
-
好的,但是
File#canWrite()呢?您需要将您的Uri转换为File虽然... -
我不明白这个问题。当你得到异常时,你就知道它已经发生了。 为什么会发生是另一个问题。 Android不应该允许它。我怀疑你正在写一个无效的
pfd对象。否则这是一个 Android 错误。 -
@pskink:我认为我无法从以
Uri开头的File获得content://还是我错过了什么? @EJP:我想知道是否可以在不修改文件的情况下写入文件。但是,我只有在尝试写入后才得到异常。
标签: java android io outputstream