首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Spring响应读取行

使用Spring响应读取行
EN

Stack Overflow用户
提问于 2019-07-23 10:29:01
回答 1查看 351关注 0票数 1

TLDR:如何使用Spring WebClient (reactive )逐行处理响应?

详细信息:

  • 远程服务器返回大小为20 Gb的响应。
  • 我的服务分别解析行(每一行被编码为UTF8)并流结果(99%的行被跳过)
  • 我不想将整个响应加载到内存中,例如,我想逐行解析服务器更新。

不幸的是,我没有找到任何将Flux<ByteBuffer>转换为Flux<String>的解决方案(在行尾拆分)。

问题:是否有任何嵌入式转换器/解码器可以这样做?

可能的解决办法:

  • 创建临时缓冲区(最初为空)
  • 对于每个输入缓冲区:
    • 准备临时缓冲区到新的,重新创建临时缓冲区.
    • 尝试从这个缓冲区读取单行(例如,读到行尾):
    • 如果仍有字节,则返回此字符串并重复行读取。
    • 如果缓冲区完成(例如,没有行分隔符):只需将这些字节复制到临时缓冲区即可。

  • 在最后一个缓冲区之后:读取临时缓冲区直到结束。

另外:您不能仅仅将输入缓冲区转换为字符串,因为一些utf8字符可以从缓冲区N开始,在缓冲区N+1继续。

EN

回答 1

Stack Overflow用户

发布于 2019-07-24 08:40:42

下面的代码可以工作,但是这是完全同步的代码(可能只是预取能力)。它使用Apache Http组件

代码语言:javascript
复制
HttpClientBuilder.create().build().use { client ->
    val responseHandler = ResponseHandler { response ->
        response.entity.content.use { content ->
            content.bufferedReader().use { buffered ->
                // create class, which can process each line. 
                val processor = StreamedLinesProcessor<TResult>()

                do {
                    val nextLine = buffered.readLine()
                    val needContinue = processor.processNextLine(nextLine)
                } while (needContinue)
                processor.getResult()
            }
        }
    }

    client.execute(HttpGet(url.toString()), responseHandler)
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57162062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档