Io 难以将下载的pdf文件写入android设备
我正在使用okhttp从web服务器下载pdf文件。文件似乎下载正确,并且创建了文件“Test.pdf”。但在Android Studio的设备文件资源管理器中,文件大小列为0 这是我的回调代码:Io 难以将下载的pdf文件写入android设备,io,kotlin,okhttp,android-file,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")
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的正确文件大小。我真的不确定为什么文件没有写入设备。也许有一种更简单的方法(效率也更低,但不要担心小文件,它已经非常快了):
writeBytes
和readBytes
是Kotlin stdlib扩展函数。也许有一种更简单的方法(效率也更低,但不要担心小文件,它已经非常快了):
writeBytes
和readBytes
是Kotlin stdlib扩展函数。每次调用OutputStream
函数都会打开一个新的OutputStream
。相反,您可以只使用一个:
val os = file.outputStream()
os.write(response.body()!!.bytes())
os.flush()
os.close()
您可能希望将其包装成一个块,而不是自己关闭它(并且):
如果您只需要编写一个ByteArray
,那么@ice1000已经建议的方法可以用更少的代码完成上述操作:
file.writeBytes(response.body()!!.bytes())
在这里,为了安全起见,我会对响应体执行
null
检查:
val responseBytes = response.body()?.bytes()
if (responseBytes != null) {
file.writeBytes(responseBytes)
} else {
// Handle error somehow
}
每次调用
OutputStream
函数都会打开一个新的OutputStream
。相反,您可以只使用一个:
val os = file.outputStream()
os.write(response.body()!!.bytes())
os.flush()
os.close()
您可能希望将其包装成一个块,而不是自己关闭它(并且):
如果您只需要编写一个ByteArray
,那么@ice1000已经建议的方法可以用更少的代码完成上述操作:
file.writeBytes(response.body()!!.bytes())
在这里,为了安全起见,我会对响应体执行
null
检查:
val responseBytes = response.body()?.bytes()
if (responseBytes != null) {
file.writeBytes(responseBytes)
} else {
// Handle error somehow
}
这很有效,谢谢你。我把这个答案归功于@zsmb13,因为他的答案就像一个教程。谢谢。我把这个答案归功于@zsmb13,因为他的答案就像一个教程。谢谢你给出了这个非常全面的答案。不管出于什么原因,我把file.outputStream()当作是一个单例…新手的错误。谢谢你给出了这个非常全面的答案。不管出于什么原因,我把file.outputStream()当作是一个单例…新手的错误。