读取并返回最大字节数。如果省略该参数,则为None或 否,读取数据并返回直到达到EOF。一个空的 如果流已经在EOF处,则返回bytes对象。
如果参数为正,且基础原始流不为 交互式,可以发出多个原始读取来满足该字节 计数(除非先达到EOF)。但是对于交互式原始流, 最多将发布一份原始读物,,并且简短的结果并不意味着 即将到来的EOF。
如果基础原始流不存在,则会引发BlockingIOError 阻止模式,目前没有可用数据。
如果读取操作返回的结果的长度可以小于给定或预期的数量;并且仍然不建议达到EOF,哪种可靠的分块方式最可靠?
interface PersonSummary
{
String getFirstname();
String getLastname();
AddressSummary getAddress();
interface AddressSummary {
String getCity();
}
}
interface PersonRepository extends Repository<Person, UUID> {
Collection<PersonSummary> findByLastname(String lastname);
}
最初,我认为出于某种原因,块大小越低,读取将完全执行的可能性就越高;但是我不完全知道这是否正确-因此它测试了上述功能的可靠性。
这也非常无效,因为import os
import io
def reliable_read(file_obj, amount=None, chk_size=2):
file_size = os.fstat(file_obj.file_no()).st_size
data = b"" if isinstance(file_obj, io.BufferedReader) else ""
amount_read = 0
if amount is None:
amount = file_size
while amount_read < amount:
data += file_obj.read(chk_size)
return data
接近1,函数调用的数量接近chk_size
,这对于真正的大文件来说并不是最佳选择。
从本质上讲,无需使用CFFI导入file_size
,fopen
和fread
-存在的内置函数或库可以可靠地读取内容,这也在我的标题范围内;该函数返回准确的读取量,或者将读取缓冲区按引用放置在列表中,或者作为fclose
的元组。
答案 0 :(得分:1)
在您引用的文档中注意:
可能会发出多次原始读取以满足字节数
这意味着此循环无用。原始读取是操作系统使用read()
执行的读取,返回的内容可能少于某些输入流上的请求。
while amount_read < amount:
data += file_obj.read(chk_size)
(加上循环没有更新amount_read
,所以我怀疑它有错误)
由于您使用的是python文件界面(而不是os.read
),因此,如果要完成该操作所需的一个或多个内部原始读取失败,则python将在内部执行此操作,并且可能会出现错误
您无需控制内部read
,因此只需执行以下操作:
data = file_obj.read(amount)
如果您不想要使用pyhton界面,请选择os.read
,其中包含您必须管理的完整控件和原始错误检查。