Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Io 难以将下载的pdf文件写入android设备_Io_Kotlin_Okhttp_Android File - Fatal编程技术网

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

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")

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

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


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()当作是一个单例…新手的错误。