【问题标题】:Reading an io.Reader of unknown size into bytes array in golang将未知大小的io.Reader读入golang中的字节数组
【发布时间】:2021-03-20 09:24:05
【问题描述】:

我有一个通过os.Open() 方法打开的文件(比如描述符名为file),所以我想将其内容读入字节数组。

我认为方法是创建后者

data := make([]byte, 10000000)

然后将内容读入其中

n, err := file.Read(data)

我的问题是是否有更优雅/惯用的方式来解决这个问题,因为事先不知道文件大小,我只是传递了一个我估计在初始化字节时会做的数字 (10000000)数组。

【问题讨论】:

  • golang.org/pkg/io/#ReadAll。无论如何读取都不起作用,因为底层读取器没有义务一次性返回所有数据。
  • 我认为这是正确的答案;如果您将其发布为答案,我会接受它

标签: go


【解决方案1】:

您可以使用 io/ioutil(最高 Go 1.15)或 os(Go 1.16 及更高版本)包。有一个辅助函数可以将整个文件读入一个字节片中。

// For Go 1.15 and lower:
package main

import "io/ioutil"

func main() {
    data, err := ioutil.ReadFile("path/to/my/file")
}
// For Go 1.16 and higher:
package main

import "os"

func main() {
    data, err := os.ReadFile("path/to/my/file")
}

在 Go 版本 1.16 中,出于兼容性原因,io/ioutil 函数仍然存在,但它已在 os 中复制。我认为只要 Go 有 1.xx 版本,它就会一直保留在 io/ioutil,因为兼容性承诺,所以你可能会继续使用那个版本。

如果您有文件描述符或任何io.Reader,您也可以使用io/ioutil 包:

package main

import (
    "io/ioutil"
    "os"
)

func main() {
    f, _ := os.Open("path/to/my/file")
    data, err := ioutil.ReadAll(f)
}

【讨论】:

    【解决方案2】:

    ioutil.ReadAll()io.ReadAll() 的包装器,它使用预定大小的“512”字节,enlarge 作为读取循环。

    您可以改用(*file.File).Stats().Size() 中的大小。

    更直接的方法是使用os.ReadFile(),它会自动文件转换为[]byte。在将文件读入字节之前,它会使用 Stats().Size() 方法 above 的大小创建 []byte。

    【讨论】:

      猜你喜欢
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      • 2020-11-13
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      相关资源
      最近更新 更多