Golang: Прочитать буфер ioutil.ReadAll from io.ReadWriter без потери контента

Давайте вычитаем контент используя golang функцию ioutil.ReadAll из io.ReadWriter таким образом, чтобы контент остался в буфере.

Golang readAll из ioutil вычитать контент без потери контента

Давайте предположим, что мы создаем буфер таким образом:

out := new(bytes.Buffer)

Затем в каком-то коде наполняем буфер, используя метод Write() из Writer interface. Например, вот, так:

out.Write([]byte("String to write\n"))
out.Write([]byte("Another string to buffer\n"))

Затем нужно все содержимое буфера вычитать чтобы записать в файл. При этом, в out буфере должен остаться сам контент.

import (
	"io"
	"io/ioutil"
)

func dirTree(out io.ReadWriter, dirName string) error {
        //let's imagine here we write to io.ReadWriter!
        //out.Write([]byte("Just string to write \n"))

        //read from buffer
	readBuf, _ := ioutil.ReadAll(out)

	//write content to file! But actually we lose content from "out" variable in previous line
	ioutil.WriteFile("dirTestName", readBuf, 0777)

	return nil
}

В этой строке readBuf, _ := ioutil.ReadAll(out) мы прочитали все содержимое буфера. В следующей строке содержимое записали в файл.

Теперь буфер пуст. Это работает как кувшин: если вычитали через ReadAll - второй раз вычитать то же самое не можем, так как кувшин пуст.

Что мы можем сделать: отправить контент назад в буфер:

out.Write(readBuf)

В конце выполнения функции dirTree контент в буфере, мы добились того, чего хотели. С маленькой оговоркой, что буфер был пуст мгновение пока записывался файл.

import (
	"io"
	"io/ioutil"
)

func dirTree(out io.ReadWriter, dirName string) error {
        //let's imagine here we write to io.ReadWriter!
        //out.Write([]byte("Just string to write \n"))

        //read from buffer
	readBuf, _ := ioutil.ReadAll(out)

	//write content to file! But actually we lose content from "out" variable in previous line
	ioutil.WriteFile("dirTestName", readBuf, 0777)
        
        //write the same content again!
        out.Write(readBuf)

	return nil
}

 

 
 
 

icon Комментарии 0

Ваш комментарий к статье.. (для авторизованных)

ctrl+enter

icon Вход в систему

зарегистрироваться
НОВЫЕ ПОЛЬЗОВАТЕЛИ