okhttp 流式输出
时间: 2025-06-22 15:16:21 浏览: 10
### OkHttp 实现流式输出的示例代码
OkHttp 提供了强大的功能来支持流式输出,可以用于上传或下载大文件而不占用过多内存。以下是实现流式输出的具体方法和代码示例。
#### 1. 引入依赖
在使用 OkHttp 之前,需要确保项目中引入了正确的依赖项。以下为 Gradle 配置:
```gradle
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
```
#### 2. 流式上传示例
以下代码展示了如何通过 OkHttp 实现流式上传文件的功能。通过自定义 `RequestBody`,可以在写入数据时动态生成输出流[^2]。
```kotlin
object HttpUtils {
private val client = OkHttpClient()
fun postStream(url: String, call: (OutputStream) -> Unit) {
val mediaType = "application/octet-stream".toMediaTypeOrNull()
val requestBody = object : RequestBody() {
override fun contentType(): MediaType? = mediaType
override fun writeTo(sink: BufferedSink) {
call(sink.outputStream())
}
}
val request = Request.Builder()
.url(url)
.post(requestBody)
.build()
val response = client.newCall(request).execute()
if (response.isSuccessful) {
response.body?.string()?.let { Log.i("okhttp", it) }
} else {
Log.e("okhttp", "Request failed: ${response.code}")
}
}
}
```
#### 3. 流式下载示例
对于大文件下载,建议避免直接调用 `response.body().string()` 方法,因为这会将整个响应加载到内存中。相反,可以通过 `BufferedSource` 来逐块读取数据[^3]。
```kotlin
fun downloadStream(url: String, call: (InputStream) -> Unit) {
val request = Request.Builder()
.url(url)
.build()
val response = OkHttpClient().newCall(request).execute()
if (response.isSuccessful) {
val source = response.body?.byteStream()
source?.let { call(it) }
} else {
Log.e("okhttp", "Download failed: ${response.code}")
}
}
```
#### 4. 使用示例
以下是如何调用上述工具类的示例代码:
**流式上传:**
```kotlin
HttpUtils.postStream("https://example.com/upload") { outputStream ->
val file = File("path/to/file.txt")
FileInputStream(file).use { inputStream ->
inputStream.copyTo(outputStream)
}
}
```
**流式下载:**
```kotlin
downloadStream("https://example.com/download") { inputStream ->
val file = File("path/to/save/file.txt")
FileOutputStream(file).use { outputStream ->
inputStream.copyTo(outputStream)
}
}
```
### 注意事项
- 在处理大文件时,应尽量避免将整个文件加载到内存中,推荐使用流式操作。
- 如果需要异步执行请求,可以结合 OkHttp 的 `enqueue` 方法或 Kotlin 协程[^3]。
- 对于 Retrofit 框架中的流式处理,可以参考 `@Streaming` 注解的使用方式[^4]。
---
阅读全文
相关推荐


















