You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android内部存储创建文件夹写入文件崩溃问题排查

Android存储写入崩溃问题:EISDIR (Is a directory) 错误分析与修复

嘿,我一眼就从你的Logcat日志里找到问题根源了!错误信息java.io.FileNotFoundException: /storage/emulated/0/Papers: open failed: EISDIR (Is a directory)已经说得很清楚:你试图把PDF文档写入一个文件夹(Papers),但FileOutputStream要求必须指向一个具体的文件路径,而不是文件夹。这就是导致应用崩溃的直接原因。

你的代码问题点

看这段出问题的代码:

val mediaStorageDir = File(Environment.getExternalStorageDirectory(), "Papers")
if (mediaStorageDir.exists()) {
    document.writeTo(FileOutputStream(mediaStorageDir))
    document.close()
}

这里的mediaStorageDir是一个文件夹对象,你直接把它传给FileOutputStream,系统自然会报错——它不知道你要把文件存在这个文件夹里的哪个具体文件啊!

修复后的代码

我帮你调整了代码,主要解决了两个核心问题:确保目标文件夹存在,以及指定具体的PDF文件路径:

val document: PdfDocument = PdfDocument()
// 保留你原本的页面绘制逻辑
val pageInfo: PdfDocument.PageInfo? = bitmap?.width?.let { it1 -> 
    bitmap?.height?.let { it2 -> 
        PdfDocument.PageInfo.Builder(it1, it2, 1).create() 
    } 
}
val page: PdfDocument.Page = document.startPage(pageInfo)
val canvas: Canvas = page.canvas
bitmap?.let { it1 -> canvas.drawBitmap(it1, 0f, 0f, null) }
document.finishPage(page)

val mediaStorageDir = File(Environment.getExternalStorageDirectory(), "Papers")
// 第一步:如果文件夹不存在,创建它(mkdirs()会自动创建所有缺失的父目录)
if (!mediaStorageDir.exists()) {
    mediaStorageDir.mkdirs()
}
// 第二步:在文件夹内创建一个具体的PDF文件(用时间戳命名避免重名)
val pdfFile = File(mediaStorageDir, "my_pdf_${System.currentTimeMillis()}.pdf")

try {
    // 写入到具体的文件路径
    document.writeTo(FileOutputStream(pdfFile))
    // 可选:给用户一个成功提示
    Toast.makeText(this, "PDF已保存到:${pdfFile.path}", Toast.LENGTH_SHORT).show()
} catch (e: IOException) {
    // 捕获异常避免崩溃,同时给用户反馈
    e.printStackTrace()
    Toast.makeText(this, "保存失败:${e.message}", Toast.LENGTH_SHORT).show()
} finally {
    // 无论成功失败,都要关闭文档释放资源
    document.close()
}

额外注意事项

  • 权限问题:如果你的应用运行在Android 6.0(API 23)及以上版本,需要动态申请WRITE_EXTERNAL_STORAGE权限(针对Android 10及以下);Android 10+推荐使用Scoped Storage或MediaStore来更合规地处理文件存储
  • 异常处理:一定要添加try-catch块捕获IO异常,这样即使保存失败,应用也不会直接崩溃,还能给用户清晰的反馈

内容的提问来源于stack exchange,提问作者Digvijay Singh Thakur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:25:43