我试图读取就是BEING柏油,流媒体,以标准输入存档,但我不知怎么读 远远 在管道的数据超过焦油发送。
我这样运行我的命令:
tar -cf - somefolder | ./my-go-binary
源代码是这样的:
package main import ( "bufio" "io" "log" "os" ) // Read from standard input func main() { reader := bufio.NewReader(os.Stdin) // Read all data from stdin, processing subsequent reads as chunks. parts := 0 for { parts++ data := make([]byte, 4<<20) // Read 4MB at a time _, err := reader.Read(data) if err == io.EOF { break } else if err != nil { log.Fatalf("Problems reading from input: %s", err) } } log.Printf("Total parts processed: %d\n", parts) }
对于100MB的涂油文件夹,我将获得1468个4MB的块(即6.15GB)!此外,data []byte数组的大小似乎无关紧要:如果将块大小设置为40MB,我仍然会获得约1400个40MB数据块,这根本没有意义。
data []byte
要os.Stdin使用Go正确读取数据,我需要做些什么吗?
os.Stdin
您的代码效率低下。data每次通过循环分配和初始化。
data
for { data := make([]byte, 4<<20) // Read 4MB at a time }
为你的代码reader作为io.Reader是错误的。例如,您忽略了读取的字节数,_, err := reader.Read(data)并且无法err正确处理错误。
reader
io.Reader
_, err := reader.Read(data)
err
套餐io import "io" 类型阅读器 type Reader interface { Read(p []byte) (n int, err error) } Reader是包装基本Read方法的接口。 Read将最多len(p)个字节读入p。它返回读取的字节数(0 <= n <= len(p))和遇到的任何错误。即使Read返回n <len(p),也可能在调用过程中将所有p用作临时空间。如果某些数据可用但不是len(p)个字节,则按常规方式,Read将返回可用数据,而不是等待更多数据。 当成功读取n> 0个字节后,Read遇到错误或文件结束条件时,它将返回读取的字节数。它可能从同一调用返回(非nil)错误,或者从后续调用返回错误(n == 0)。这种一般情况的一个实例是,读取器在输入流的末尾返回非零字节数的情况下,可能返回err == EOF或err == nil。下一次读取应返回0,无论EOF为何。 在考虑错误err之前,调用者应始终处理返回的n> 0个字节。这样做可以正确处理在读取某些字节后发生的I / O错误,以及两种允许的EOF行为。 不鼓励Read的实现不返回零字节且错误为nil的计数,除非len(p)== 0除外。调用者应将返回0和nil视为没有任何反应;特别是它并不表示EOF。 实现不得保留p。
套餐io
import "io"
类型阅读器
type Reader interface { Read(p []byte) (n int, err error) }
Reader是包装基本Read方法的接口。
Read将最多len(p)个字节读入p。它返回读取的字节数(0 <= n <= len(p))和遇到的任何错误。即使Read返回n <len(p),也可能在调用过程中将所有p用作临时空间。如果某些数据可用但不是len(p)个字节,则按常规方式,Read将返回可用数据,而不是等待更多数据。
当成功读取n> 0个字节后,Read遇到错误或文件结束条件时,它将返回读取的字节数。它可能从同一调用返回(非nil)错误,或者从后续调用返回错误(n == 0)。这种一般情况的一个实例是,读取器在输入流的末尾返回非零字节数的情况下,可能返回err == EOF或err == nil。下一次读取应返回0,无论EOF为何。
在考虑错误err之前,调用者应始终处理返回的n> 0个字节。这样做可以正确处理在读取某些字节后发生的I / O错误,以及两种允许的EOF行为。
不鼓励Read的实现不返回零字节且错误为nil的计数,除非len(p)== 0除外。调用者应将返回0和nil视为没有任何反应;特别是它并不表示EOF。
实现不得保留p。
这是符合io.Reader接口的模型文件读取程序:
package main import ( "bufio" "io" "log" "os" ) func main() { nBytes, nChunks := int64(0), int64(0) r := bufio.NewReader(os.Stdin) buf := make([]byte, 0, 4*1024) for { n, err := r.Read(buf[:cap(buf)]) buf = buf[:n] if n == 0 { if err == nil { continue } if err == io.EOF { break } log.Fatal(err) } nChunks++ nBytes += int64(len(buf)) // process buf if err != nil && err != io.EOF { log.Fatal(err) } } log.Println("Bytes:", nBytes, "Chunks:", nChunks) }
输出:
2014/11/29 10:00:05字节:5589891块:1365