当前位置: 首页 > 面试题库 >

如何从同一io.Reader读取多次

宦琪
2023-03-14
问题内容

我想使用request.Body(type io.ReadCloser)其中包含图像。

我不想使用,ioutil.ReadAll()因为我想将此主体直接写入文件并希望对其进行解码,所以我只想使用对内容的引用来传递给进一步的函数调用,

我尝试创建读取器的多个实例,如下所示

package main

import (
    "io/ioutil"
    "log"
    "strings"
)


func main() {
    r := strings.NewReader("some io.Reader stream to be read\n")
    a := &r
    b := &r
    log.Println(ioutil.ReadAll(*a))
    log.Println(ioutil.ReadAll(*b))

}

但是在第二次通话中它总是导致nil

请帮助我如何为同一读者传递多个单独的参考?


问题答案:

io.Reader被视为流。因此,您无法阅读两次。想象一下传入的TCP连接。您无法倒带进来的内容。

但是您可以使用io.TeeReader复制流:

package main

import (
    "bytes"
    "io"
    "io/ioutil"
    "log"
    "strings"
)

func main() {
    r := strings.NewReader("some io.Reader stream to be read\n")
    var buf bytes.Buffer
    tee := io.TeeReader(r, &buf)

    log.Println(ioutil.ReadAll(tee))
    log.Println(ioutil.ReadAll(&buf)) 
}

Go
Playground上的
示例

编辑: 正如@mrclx指出的:您需要从第TeeReader一个读取,否则缓冲区将为空。



 类似资料:
  • 我在三个阶段阅读xml文件,在每个阶段,我对不同的元素感兴趣,基于输入参数。 使用XMLStreamReader多次读取一个xml文件的最佳方法是什么? 其中inputStream是FileInputStream实例 目前,我得到了StreamClosed异常或streamReader。当我开始第二阶段读取时,hasNext()为false。

  • 问题内容: 我有以下代码: 和此web.xml(缩短了程序包并更改了名称,但外观相同) 我想在过滤器之后调用Servlet。我希望可以做到这一点,但是我总是会遇到以下错误: 问题答案: 你可能开始使用 in 使用HttpServletRequest : 你的servlet尝试调用相同的请求,这是不允许的。你需要做的是使用制作请求正文的副本,因此你可以使用多种方法读取它。

  • 问题内容: 我正在尝试在Python中多次读取某些文件的行。 我正在使用这种基本方式: 一切正常,但是如果我想在文件仍处于打开状态的情况下每行第二次进行迭代,例如: 然后它不起作用,我需要打开,然后关闭,然后再次打开我的文件以使其正常工作。 感谢您的回答! 问题答案: 使用file.seek()跳到文件中的特定位置。但是,请考虑是否真的有必要再次浏览该文件。也许有更好的选择。

  • 问题内容: 我创建了一些代码,要求用户输入int值,然后将其传递给我的第一个方法parity()。然后,Parity()会告诉用户它是奇数还是偶数。该方法完成后,我希望我的主程序打开与程序位于同一程序包中的文件,但我的异常不断出现,并终止输出“找不到文件或无法打开文件”的程序是一个简单的修复程序,但是我尝试的大部分操作并没有使它变得更好。到目前为止,这是我的代码: 问题答案: 我不确定我是否理解正

  • 我一直在努力阅读java项目中的文本文件,我一整天都在寻找解决方案,我尝试了很多方法,但没有一个有效。其中一些:(另外,我必须使用文件和扫描程序类) 异常线程"main"java.nio.file.NoSuchFileExc0019: test\fileTest.txt 异常线程"main"java.lang.NullPointerExc0019 线程“main”java中出现异常。木卫一。Fil

  • 问题内容: 我正在编写一个长期运行的任务,该任务多次从mongodb(使用mgo)获取。然后使用此模块将其写入xlsx文件。然后使用重新读取,然后将其存储到我的ftp服务器中。 函数会消耗大量内存,因此,我认为应该有一种方法不保存文件,而是将数据从xlsx.Write直接传递到ftp.Store。(如果我可以同时进行流传输,那将是完美的,因为在将它们发送到Stor函数之前,不必将所有文档都保留在服