【问题标题】:Difficulty writing downloaded pdf file to android device难以将下载的 pdf 文件写入 android 设备
【发布时间】:2018-05-05 18:27:08
【问题描述】:

我正在使用 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。我真的不确定为什么文件没有写入设备。

【问题讨论】:

    标签: io kotlin okhttp android-file


    【解决方案1】:

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

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

    writeBytesreadBytes 是 Kotlin 标准库扩展函数。

    【讨论】:

    • 这行得通,谢谢。我将答案归功于@zsmb13,因为他的回答就像一个教程。
    【解决方案2】:

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

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

    您可能希望将其包装在 use 块中,而不是自己关闭它(和 flushing it isn't necessary):

    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
    }
    

    【讨论】:

    • 感谢您提供如此全面的回答。无论出于何种原因,我都将 file.outputStream() 视为单身......新手错误。
    猜你喜欢
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 2019-12-13
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    相关资源
    最近更新 更多