难以将下载的 pdf 文件写入 android 设备

Difficulty writing downloaded pdf file to android device

我正在使用 okhttp 从 Web 服务器下载 pdf 文件。该文件似乎可以正确下载,并且文件 "Test.pdf" 已创建。文件大小在 Android Studio 的设备文件资源管理器中显示为 0。

这是我的回调代码:

client.newCall(request).enqueue(object : Callback {

    override fun onFailure(call: Call, e: IOException) {
                    println("Failed")
                }

    override fun onResponse(call: Call, response: Response) {

                    println("Success!")

                    val file = File(filesDir, "Test.pdf")
                    println(response.body()!!.bytes().size)

                    file.outputStream().write(response.body()!!.bytes())
                    file.outputStream().flush()
                    file.outputStream().close()
                }
            })

println 语句显示正确的文件大小为 6MB。我真的不确定为什么文件没有写入设备。

也许有更简单的方法(效率也较低,但不用担心小文件,它已经很快了):

File(filesDir, "Test.pdf").writeBytes(URL("your url").readBytes())

writeBytesreadBytes 是 Kotlin stdlib 扩展函数。

每次调用 outputStream 函数都会打开一个新的 OutputStream。相反,您可以只使用一个:

val os = file.outputStream()
os.write(response.body()!!.bytes())
os.flush()
os.close()

您可能想将其包装在 use block instead of closing it yourself (and ):

file.outputStream().use { os ->
    os.write(response.body()!!.bytes())
}

如果你只需要写一个ByteArray,@ice1000已经建议的writeBytes方法用更少的代码就可以完成上面的工作:

file.writeBytes(response.body()!!.bytes())

在这里,为了安全起见,我会对响应主体执行 null 检查:

val responseBytes = response.body()?.bytes()
if (responseBytes != null) {
    file.writeBytes(responseBytes)
} else {
    // Handle error somehow
}