【问题标题】:Read contents from what io.Writer writes从 io.Writer 写入的内容中读取内容
【发布时间】:2018-01-03 04:59:29
【问题描述】:

有一个导出文件的库,但我想捕获文件的内容。我想将写入器传递给库并能够读取写入器写入文件的内容。最终我想扩充库以跳过编写此文件。 这对 io.Copy 或 io.Pipe 可行吗?

库代码创建一个 *File 并将此句柄用作 io.Writer。 我尝试使用 io.Copy 但只读取了 0 个字节。

func TestFileCopy(t *testing.T) {

codeFile, err := os.Create("test.txt")
if err != nil {
    t.Error(err)
}
defer codeFile.Close()
codeFile.WriteString("Hello World")
n, err := io.Copy(os.Stdout, codeFile)
if err != nil {
    t.Error(err)
}
log.Println(n, "bytes")
}

【问题讨论】:

    标签: go io


    【解决方案1】:

    如果您想在写入时捕获字节,请使用io.MultiWriterbytes.Buffer 作为第二个写入器。

    var buf bytes.Buffer
    w := io.MultiWriter(codeFile, &buf)
    

    或在标准输出上查看写入的文件:

    w := io.MultiWriter(codeFile, os.Stdout)
    

    否则,如果要重新读取同一个文件,则需要在写入后寻回开始:

    codeFile.Seek(0, 0)
    

    【讨论】:

    • 或者因为在示例中他想要控制台上的输出,他可以传递os.Stdout 作为第二作者:w := io.MultiWriter(codeFile, os.Stdout)
    • io.Multiwriter 文档示例清楚地说明了用法。首先使用io.MultiWriter 设置所有编写器,然后调用io.Copy。所以可以去io.MultiWriter(codeFile, &buf, os.Stdout)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多