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