- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我想通过尝试再读取一个字节(并捕获 EOF)来确认没有更多的字节可以从缓冲读取器(既不是来自内部缓冲区,也不是来自底层文件对象)中读取。
使用 bufio.Read
或 bufio.ReadByte
是否适合此目的?
从bufio.Read
看不清楚documentation在非 EOF 情况下,返回的整数是否可以为零。即,如果 len(p) > 0
,0, nil
是有效的返回值吗?
func (b *Reader) Read(p []byte) (n int, err error)
Read reads data into p. It returns the number of bytes read into p. The bytes are taken from at most one Read on the underlying Reader, hence n may be less than len(p). To read exactly len(p) bytes, use io.ReadFull(b, p). At EOF, the count will be zero and err will be io.EOF.
同样,bufio.ReadByte
文档并没有很好地将错误情况与 EOF 情况区分开来,也没有准确定义“可用”的含义(即在内部缓冲区中可用) ,或在基础文件中可用)?
func (b *Reader) ReadByte() (byte, error)
ReadByte reads and returns a single byte. If no byte is available, returns an error.
最佳答案
将长度为 1 的缓冲区传递给 bufio.Read
,当读取器得到底层 os.File 的支持时,确实会返回 n==0 , io.EOF
如果文件在 EOF。
文档有点不精确,因为某些行为取决于您传递给 bufio
阅读器的底层阅读器。 bufio.Read()
的代码画出更准确的画面。我将概述逻辑。
bufio.Read
:只有在内部缓冲区中的所有字节都已用完时,才会向底层读取器发出一个Read
。因此,据推测,如果您已经从缓冲读取器中读取的字节数与底层文件中的字节数一样多,那么当您最后一次调用 bufio.Read(buf[0: 1])
检查 EOF。
当内部缓冲区耗尽时,您向 bufio
读取器请求更多,bufio.Read
将最多 调用一次底层读者。您得到的错误类型将取决于您的底层读者。
当读取指针已经位于 EOF 时,要求从 os.File
读取 n > 0
字节应该返回 0, io.EOF
(根据 os.File File.Read
上的文档)。但是,如果您的底层读取器是其他东西,也许是特定于您的应用程序的自定义类型,旨在在 EOF 处返回 0, nil
,那么 bufio.Read
会回显它。
bufio.ReadByte
:bufio.ReadByte
背后的逻辑略有不同,但在底层读取器是 os.File
的情况下,结果应该与 bufio.Read
相同。与 bufio.Read
的主要区别在于 bufio.ReadByte
可以多次尝试重新填充内部缓冲区。如果在重新填充期间遇到错误(对于 EOF 处的 os.File
读取器就是这种情况),它将在第一次错误读取尝试后返回。因此,如果您的底层阅读器是一个 os.File
阅读器,那么您将获得 0, io.EOF
当且仅当您的底层文件位于 EOF。如果您的底层阅读器是自定义阅读器类型,它仅在 EOF 处返回 0, nil
,则 bufio.ReadByte
最终会发出“NoProgress”错误。我不确定为什么重试逻辑仅在 bufio.ReadByte
中,但好消息是如果您的基础文件的行为类似于 os.File
,则可以使用任一选项>.
其他信息:
这并不直接适用于 golang,但您可能会发现以下线程很有趣:Can read(2) return zero bytes when not at EOF .它的主题是 read() 系统调用的语义 (POSIX)。读取非阻塞套接字/文件,即使没有数据准备好,也应该返回 -1,而不是 0,并设置 errno EAGAIN(或中断时的 EINTR)。非阻塞套接字/文件并不是真正的原生概念(据我所知),特别是 bufio
模块将 panic()
无论何时/如果底层读取器返回负数,因此您不必担心。
关于golang bufio.Read 或 bufio.ReadByte 检测文件是否在 EOF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55388581/
我有一个 if 语句,如下所示 if (not(fullpath.lower().endswith(".pdf")) or not (fullpath.lower().endswith(tup
然而,在 PHP 中,可以: only appears if $foo is true. only appears if $foo is false. 在 Javascript 中,能否在一个脚
XML有很多好处。它既是机器可读的,也是人类可读的,它具有标准化的格式,并且用途广泛。 它也有一些缺点。它是冗长的,不是传输大量数据的非常有效的方法。 XML最有用的方面之一是模式语言。使用模式,您可
由于长期使用 SQL2000,我并没有真正深入了解公用表表达式。 我给出的答案here (#4025380)和 here (#4018793)违背了潮流,因为他们没有使用 CTE。 我很欣赏它们对于递
我有一个应用程序: void deleteObj(id){ MyObj obj = getObjById(id); if (obj == null) { throw n
我的代码如下。可能我以类似的方式多次使用它,即简单地说,我正在以这种方式管理 session 和事务: List users= null; try{ sess
在开发J2EE Web应用程序时,我通常会按以下方式组织我的包结构 com.jameselsey.. 控制器-控制器/操作转到此处 服务-事务服务类,由控制器调用 域-应用程序使用的我的域类/对象 D
这更多是出于好奇而不是任何重要问题,但我只是想知道 memmove 中的以下片段文档: Copying takes place as if an intermediate buffer were us
路径压缩涉及将根指定为路径上每个节点的新父节点——这可能会降低根的等级,并可能降低路径上所有节点的等级。有办法解决这个问题吗?有必要处理这个吗?或者,也许可以将等级视为树高的上限而不是确切的高度? 谢
我有两个类,A 和 B。A 是 B 的父类,我有一个函数接收指向 A 类型类的指针,检查它是否也是 B 类型,如果是将调用另一个函数,该函数接受一个指向类型 B 的类的指针。当函数调用另一个函数时,我
有没有办法让 valgrind 使用多个处理器? 我正在使用 valgrind 的 callgrind 进行一些瓶颈分析,并注意到我的应用程序中的资源使用行为与在 valgrind/callgrind
假设我们要使用 ReaderT [(a,b)]超过 Maybe monad,然后我们想在列表中进行查找。 现在,一个简单且不常见的方法是: 第一种可能性 find a = ReaderT (looku
我的代码似乎有问题。我需要说的是: if ( $('html').attr('lang').val() == 'fr-FR' ) { // do this } else { // do
根据this文章(2018 年 4 月)AKS 在可用性集中运行时能够跨故障域智能放置 Pod,但尚不考虑更新域。很快就会使用更新域将 Pod 放入 AKS 中吗? 最佳答案 当您设置集群时,它已经自
course | section | type comart2 : bsit201 : lec comart2 :
我正在开发自己的 SDK,而这又依赖于某些第 3 方 SDK。例如 - OkHttp。 我应该将 OkHttp 添加到我的 build.gradle 中,还是让我的 SDK 用户包含它?在这种情况下,
随着 Rust 越来越充实,我对它的兴趣开始激起。我喜欢它支持代数数据类型,尤其是那些匹配的事实,但是对其他功能习语有什么想法吗? 例如标准库中是否有标准过滤器/映射/归约函数的集合,更重要的是,您能
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 9 年前。 Improve
我一直在研究 PHP 中的对象。我见过的所有示例甚至在它们自己的对象上都使用了对象构造函数。 PHP 会强制您这样做吗?如果是,为什么? 例如: firstname = $firstname;
...比关联数组? 关联数组会占用更多内存吗? $arr = array(1, 1, 1); $arr[10] = 1; $arr[] = 1; // <- index is 11; does the
我是一名优秀的程序员,十分优秀!