golang读取更多4096字节

时间:2018-10-31 15:21:10

标签: file go

我尝试从TLS连接读取文件,但只能读取4096个字节(n = 4096)。如何读取完整文件?

reader := bufio.NewReader(pc.conn)
msg := make([]byte, 10*1024*1024)
n,err:=reader.Read(msg)

1 个答案:

答案 0 :(得分:1)

io.Reader.Read(p []byte) —如果成功,则可以自由返回1到len(p)之间的任意数量的字节;这是 its contract

  

Read最多将len(p)个字节读入p。它返回读取的字节数(0 <= n <= len(p))和遇到的任何错误。即使Read返回n < len(p),它也可能在呼叫过程中将所有p用作临时空间。如果某些数据可用,但没有len(p)字节,则 Read通常会返回可用数据,而不是等待更多数据。

(强调我的。)

您正在观察的“幻数” 4096可能是TLS连接下某些软件的缓存大小。

这实际上与read(2) POSIX syscall的合同匹配 (对于套接字,它实际上是recv(2)-来自Go所支持的每个平台(包括Windows)所实现的“ BSD套接字”; its counterpart from Winsock具有相同的语义FWIW)。

如果确切知道需要从源中读取多少字节,请使用io.ReadFull帮助器。 这通常是处理数据的最简单方法 以类似TLV的格式编码(encoding/binary也有帮助)。