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

时间:2018-05-05 18:27:08

标签: io kotlin okhttp android-file

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

2 个答案:

答案 0 :(得分:2)

也许有一种更简单的方法(也效率较低,但不要担心小文件,它已经非常快):

MongoCollection<Document> coll = client.getDatabase("db").getCollection("projects");
FindIterable<Document> result = coll.find(query);

BasicDBList list = new BasicDBList();
result.into(list);

return list;

File(filesDir, "Test.pdf").writeBytes(URL("your url").readBytes()) writeBytes是Kotlin stdlib扩展函数。

答案 1 :(得分:1)

您在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
}