发明名称 一种基于键值库的文件与结构化数据统一存储方法
摘要 本发明涉及一种基于键值库的文件与结构化数据统一存储方法,属于计算机数据管理技术领域。本方法通过将文件切分成多个数据块,在键值库符合特定模式的表格中存储文件及文件夹元数据和文件数据块,支持对文件及结构化数据进行统一存储,并支持使用可统一标识文件和结构化数据资源的存储标识符创建、删除、访问文件及结构化数据,通过对存储标识符及用户请求的访问模式进行判断,自动向用户提供对文件及结构化数据的字节数组、流、本地路径等三种上传下载方式。本方法由于基于键值库,保持了键值库提供的高可扩展性、高可伸缩性等海量存储合优越特性,且在形成的用户访问接口及管理模式方面具有简单易用、高可扩充、上传下载速度性能高等优点。
申请公布号 CN102298641B 申请公布日期 2013.05.01
申请号 CN201110272333.6 申请日期 2011.09.14
申请人 清华大学 发明人 王建民;朱妤晴;李旭嘉;杨义繁;丁贵广
分类号 G06F17/30(2006.01)I 主分类号 G06F17/30(2006.01)I
代理机构 北京清亦华知识产权代理事务所(普通合伙) 11201 代理人 罗文群
主权项 一种基于键值库的文件与结构化数据统一存储方法,其特征在于该方法包括以下步骤:(1)用户初始化键值库,键值库中具有表格、列簇和列三种单元的结构化存储模式,其中,表格包含多个列簇,每个列簇包含一个或多个列,数据按行存入表格中,每行数据在同一表格中用行键识别,数据存储在列中,一行列数据存储在一个或多个列簇中;(2)建成对文件与结构化数据统一进行高效访问的存储接口模块,在键值库中为文件建立元数据表格,在元数据表格中存储文件的属性数据,所述的元数据表格包含元数据和内容数据两个列簇,分别用以表示文件或文件所在的文件夹的属性数据和文件的内容数据;(3)存储接口模块通过将文件拆分成多个数据块存储在键值库中,使用一行元数据和多行内容数据存储一个文件,存储形式如下:文件在所在文件系统中的路径所形成的行键,与该行键相对应的行数据存储在元数据列簇下,该行数据为文件的属性数据,该属性数据包括一列文件名、一列文件所在的父文件夹路径和一列文件内容数据的第一个数据块的行键;文件内容数据被切分成数据块后存储在内容数据列簇中,每个数据块为一行,数据块的行键为即时生成的通用唯一识别码(UUID),所述的内容数据列簇包括一列下一个数据块的行键、一列本数据块的内容,若该数据块为最后一个数据块,则将下一个数据块行键列的内容记为“文件结尾”;(4)存储接口模块用一行元数据存储一个文件夹,存储形式如下:文件夹在所在文件系统中的路径形成行键,与该行键相对应的行数据存储在元数据列簇下,该行数据为文件夹的属性数据,该属性数据包括一列文件夹的名称和一列文件夹所在的父文件夹路径,若该文件夹存在子文件,则属性数据还包括子文件路径,若该文件夹存在子文件夹,则属性数据还包括子文件夹路径;(5)当存储接口模块接到用户的构造命令及相应构造参数时,存储接口模块返回用户所访问资源的存储标识符,该存储标识符标识文件夹、文件、表格、行、列簇和列6种资源,若用户访问的是文件夹或文件,则构造参数为路径,若用户访问的是表格,则构造参数为表格名称或表格名称与一个或多个列簇名称,若用户访问的是行,则构造参数为表格名称和行键,若用户访问的是列簇,则构造参数为表格名称、行键和列簇名称,若用户访问的是列,则构造参数为表格名称、行键、列簇名称和列名称;(6)当存储接口模块接到用户的创建命令及相应的存储标识符时,存储接口模块对存储标识符进行识别:(6-1)若为文件、行、列簇或列中的任何一种资源,则向用户返回“不支持此资源”信息;(6-2)若为表格资源,则存储接口模块对键值库进行检查,若键值库中已存在同名 的表格,则向用户返回“已存在同名表格”信息,若键值库中不存在同名的表格,则在键值库中创建含指定表格名称的表格,并向用户返回“创建成功”信息;(6-3)若为文件夹资源,则存储接口模块对指定路径进行判断,若指定路径下已存储同名的文件或文件夹,则向用户返回“已经存在同名资源”信息,若指定路径下未存储同名的文件或文件夹,则对父文件夹进行判断,若不存在父文件夹,则重复步骤(6-3),创建父文件夹,使得父文件夹存在,若存在父文件夹,则在父文件夹所在行的元数据列簇下插入一个列,列的名称为指定路径名称,并添加特殊前缀,列的数据为指定路径,同时创建本文件夹路径的所在行,行的数据分布在元数据列簇下,在该行元数据列簇下增加两列,其中一列记录本文件夹名称,另一列记录父文件夹路径,向用户返回“成功”信息;若创建父文件夹过程中出现“已存在同名资源”信息,则向用户返回“失败”信息;(7)当存储接口模块接到用户的删除命令及相应的存储标识符时,存储接口模块对存储标识符进行识别:(7-1)当存储标识符标识的是表格资源时,存储接口模块对表格资源进行判断:(7-1-1)若键值库中存在与该表格资源相对应的表格,则从键值库中删除与该表格资源相对应的表格,并向用户返回“成功”信息;(7-1-2)若键值库中不存在与该表格资源相对应的表格,则向用户返回“成功”信息;(7-2)当存储标识符标识的是列资源时,存储接口模块对列资源进行判断:(7-2-1)若键值库中存在与该列资源相对应的列,则从键值库中删除与该列资源相对应的列,并向用户返回“成功”信息;(7-2-2)若键值库中不存在与该列资源相对应的列,则向用户返回“成功”信息;(7-3)当存储标识符标识的是列簇资源时,存储接口模块对列簇资源进行判断:(7-3-1)若键值库中存在与该列簇资源相对应的列簇,则从键值库中删除与该列簇资源相对应的列簇,并向用户返回“成功”信息;(7-3-2)若键值库中不存在与该列簇资源相对应的列簇,则向用户返回“成功”信息;(7-4)当存储标识符标识的是行资源时,存储接口模块对行资源进行判断:(7-4-1)若键值库存在与该行资源相对应的行时,存储接口模块对行中存储了数据的各列簇使用步骤(7-3)逐一进行删除,并向用户返回“成功”信息;(7-4-2)若键值库不存在与该行资源相对应的行时,则向用户返回“成功”信息;(7‑5)当存储标识符标识的是文件资源时,存储接口模块从键值库中的该文件的父文件夹所在元数据行中删除记录该文件路径的列,同时从该文件所在元数据行中获取该文件的首个数据块所在行键,将首个数据块作为当前数据块,从当前数据块所在行中读出下一数据块的行键后,删除当前数据块,再将下一数据块置为当前数据块,重复上述读出和删除的操作,直到读出下一数据块行键为“文件结尾”的数据块,将下一数据块的行键为 “文件结尾”的数据块置为当前数据块后,删除当前数据块,同时删除该文件的元数据行,并向用户返回“成功”信息;(7-6)当存储标识符标识的是文件夹资源时,存储接口模块先从键值库中的该文件夹的父文件夹所在元数据行中删除记录该文件夹路径的列,从该文件夹所在元数据行中获取存储各子文件或子文件夹的路径,并重复步骤(7-5)或(7-6),删除各子文件或子文件夹,直到该文件夹不存在子文件或子文件夹,当该文件夹不存在子文件或子文件夹时,删除该文件夹所在的元数据行,并向用户返回“成功”信息;(8)当存储接口模块接到用户的字节上传命令及相应的存储标识符、字节数据、追加选项时,存储接口模块对存储标识符进行识别:(8-1)若存储标识符标识的是文件夹、表格、行或列簇,则向用户返回“不支持”信息;(8-2)若存储标识符标识的是列,对追加选项进行识别:(8-2-1)当追加选项为假时,存储接口模块对与存储标识符标识的列相关的表格和列簇进行判断,若与存储标识符标识的列相关的表格或列簇存在,则在键值库中将字节数据存储到存储标识符标识的列,并向用户返回“成功”信息,若与存储标识符标识的列相关的表格或列簇不存在,则向用户返回“失败”信息,(8-2-2)当追加选项为真时,存储接口模块对存储标识符标识的列进行判断,若存储标识符标识的列存在,则从键值库中读取存储标识符标识的列的数据,并将字节数据追加到存储标识符标识的列的数据,存入存储标识符标识的列中,若存储标识符标识的列不存在,则向用户返回“失败”信息;(8-3)若存储标识符标识的是文件,则存储接口模块对键值库进行查询:(8-3-1)若键值库中不存在存储标识符标识的文件,则对该文件的父文件夹进行判断,若键值库中不存在该文件的父文件夹,则使用步骤(6-3)创建该文件的父文件夹,使得键值库中存在该文件的文件夹,则进行步骤(8-3-1-1);若键值库中存在该文件的父文件夹,则进行步骤(8-3-1-1);(8-3-1-1)在该文件的父文件夹的元数据行中增加一列记录该文件的路径,创建该文件的元数据行,确定该文件内容的第一个数据块的行键,使用第一个数据块的行键创建内容数据行,再将字节数据写入第一个内容数据行的数据列,最后置下一数据块行键列为“文件结尾”,并向用户返回“成功”信息;(8-3-2)若键值库中存在与存储标识符标识的文件同名的文件夹,则向用户返回“同名文件夹存在”信息;(8-3-3)若键值库中存在存储标识符标识的文件,则对追加选项进行判断:(8-3-3-1)若追加选项为假,则读取该文件的元数据行,获得文件内容第一个数据块的行键,并将字节数据写入第一个数据块的行键所指示的内容数据行的数据列中,读取第一数据块内容数据行,获得下一数据块的行键,并将第一数据块的下一数据块行键列 置为“文件结尾”,同时置下一数据块为当前数据块,读取该当前数据块的下一数据块行键的列,获得下一数据块的行键,并删除该当前数据块的内容数据行,置下一数据块为当前数据块,重复上述读取删除操作,直到当前数据块的下一数据块行键列的值为“文件结尾”,删除当前数据块的内容数据行,向用户返回“成功”信息;(8-3-3-2)若追加选项为真,则读取该文件元数据行,获得文件内容第一个数据块的行键,置第一个数据块为当前数据块,从该当前数据块的行键所指示的内容数据行中读取下一数据块的行键,重复“置数据块为当前数据块,从该当前数据块的行键所指示的内容数据行中读取下一数据块的行键”的操作,直到当前数据块的内容数据行的下一数据块行键列值为“文件结尾”,读出当前数据块的内容数据,并将字节数据追加到当前数据块的内容数据后,得到新的当前数据块内容数据,进行步骤(8-3-3-2-1);(8-3-3-2-1)根据用户设定的数据块大小域值判断当前数据块内容数据大小,若当前数据块内容数据大小超过数据块大小域值,则将当前数据块拆分出一块等于数据块大小域值的数据块和最后一块内容数据块,将当前数据块设为大小等于数据块大小域值的数据块后,将当前数据块内容数据写入当前数据块的内容数据行的数据中,构建下一数据块的行键,并在当前数据块的内容数据行中写入下一数据块的行键,并将最后一块剩余内容数据块设为当前数据块,重复步骤(8-3-3-2-1),直到最后一块内容数据块不超过数据块大小域值,并将最后一块内容数据块写入该数据块行键指定的内容数据行的数据列中,并置下一数据块行键列内容为“文件结尾”,向用户返回“成功”信息;(9)当存储接口模块接到用户的本地路径上传命令及相应的存储标识符、本地文件或本地文件夹路径时,存储接口模块对存储标识符进行识别:(9-1)若存储标识符标识的是表格、行、列簇或列,则向用户返回“不支持”信息;(9-2)若存储标识符标识的是文件且本地路径是文件夹,则向用户返回“错误”信息;(9-3)若存储标识符标识的是文件夹且本地路径是文件,则向用户返回“错误”信息;(9-4)若存储标识符标识的是文件且本地路径是文件,则存储接口模块使用步骤(6-3)创建该文件的父文件夹,若步骤(6-3)返回“失败”信息,则向用户返回“失败”信息,若步骤(6-3)返回“已经存在同名资源”或“成功”信息,则在该文件所在父文件夹的元数据行中增加“该文件路径”列,同时创建该文件的元数据行,确定该文件内容第一个数据块的行键,置第一个数据块为当前数据块,并置当前文件读取位置为0,从本地路径所指示的文件内容的当前文件读取位置向后读取数据,使读取的数据大小等于数据块大小域值,形成第一个数据块,将该第一个数据块内容写入当前数据块行键所指示的内容数据行的数据列中,同时存储接口模块确定下一个数据块的行键,并将下一个数据块的行键写入当前数据块的内容数据行的下一数据块行键列中,置下一个数据块为当前数据块,将当前文件读取位置加上数据块大小域值,重复上述读取数据块、写入数据块、确 定行键、置当前数据块的操作,直至读到本地文件内容的最后一个数据块,将最后一个数据块内容写入该数据块内容数据行的数据列后,在该数据块内容数据行的下一数据块行键列中写入“文件结尾”,向用户返回“成功”信息;(9-5)若存储标识符标识的是文件夹且本地路径是文件夹,使用步骤(6‑3)创建该文件夹,若步骤(6‑3)返回“已经存在同名资源”或“失败”信息,则向用户返回“已经存在同名资源”或“失败”信息,若步骤(6‑3)返回“成功”信息,则读取本地路径所指示文件夹的一个子文件或子文件夹i(i=1,2,..,n),并使用步骤(9‑3)或(9‑4)对子文件或子文件夹i进行上传后,在存储标识符标识的文件夹的元数据行中添加“子文件路径”或“子文件夹路径”列以及内容为子文件或子文件夹i的元数据行行键的列数据,重复上述上传子文件或子文件夹的步骤,直到将n个子文件或子文件夹上传完成后,向用户返回“成功”信息,当重复过程中出现子文件或子文件夹上传失败,则向用户返回“失败”信息;(10)当存储接口模块接到用户的流上传命令及相应的存储标识符、追加选项时,存储接口模块初始化一个大小等于用户设定的数据块大小域值的本地内存缓存区,并将本地内存缓存区内容置为空,对存储标识符进行识别:(10‑1)若存储标识符标识的是文件夹、表格、行或列簇,则向用户返回“不支持”信息;(10‑2)若存储标识符标识的是列,则对追加选项进行判断:(10‑2‑1)若追加选项为假,则存储接口模块对存储标识符中标识的列所在的表格和列簇进行判断,若存储标识符标识的列所在的表格和列簇不存在,则向用户返回“失败”信息,若存储标识符标识的列所在的表格和列簇存在,则将存储标识符标识的键值库中的列数据置为空,并打开一个输出流,向用户返回该输出流操作对象;(10‑2‑2)若追加选项为真,则存储接口模块对存储标识符中标识的列进行判断,若存储标识符标识的列不存在,则向用户返回“失败”信息,若存储标识符标识的列存在,则将存储标识符标识的键值库中的列数据读到本地内存缓存区中,将存储标识符标识的键值库中的列数据置为空,并打开一个输出流,向用户返回该输出流操作对象;(10‑3)若存储标识符标识的是文件,则存储接口模块对键值库进行查询:(10‑3‑1)若键值库中不存在存储标识符标识的文件,则存储接口模块对该文件的父文件夹进行判断,若键值库中不存在该文件的父文件夹,则使用步骤(6‑3)创建该文件的父文件夹,使得该文件的父文件夹存在,该文件的父文件夹存在后,在该文件的父文件夹的元数据行中增加“该文件路径”列,同时创建该文件的元数据行,确定该文件内容第一个数据块的行键,使用第一个数据块的行键创建内容数据行,将该内容数据行的下一数据块行键列置为“文件结尾”,并打开一个输出流,向用户返回该输出流操作对象;(10‑3‑2)若键值库中存在与存储标识符标识的文件同名的文件夹,则向用户返回“同名文件夹存在”信息;(10‑3‑3)若键值库中存在存储标识符标识的文件,则对追加选项进行判断:(10‑3‑3‑1)若追加选项为假,则存储接口模块读取该文件元数据行,获得文件内容第一个数据块的行键,读取第一数据块的行键所指示的内容数据行,以获得下一数据块的行键,将第一数据块的下一数据块行键列置为“文件结尾”,同时置下一数据块为当前数据块,读取该当前数据块内容数据行,以获得下一数据块的行键,删除当前数据块的内容数据行后置下一数据块为当前数据块,重复上述置当前数据块、获取下一数据块行键、删除当前数据行的操作直到获取当前数据块的下一数据块行键列数据为“文件结尾”,删除当前数据块的内容数据行,打开一个输出流,向用户返回该输出流操作对象;(10‑3‑3‑2)若追加选项为真,则存储接口模块读取该文件元数据行,以获得文件内容第一个数据块的行键,置第一个数据块为当前数据块,读取该当前数据块的行键所指示的内容数据行,以获得下一数据块的行键,重复读取下一数据块行键列查找下一数据块内容数据行的操作,直到当前数据块的内容数据行的下一数据块行键列值为“文件结尾”,将当前数据块内容数据读到本地内存缓存区中,打开一个输出流,向用户返回该输出流操作对象;(10‑4)用户使用上述输出流操作对象,以字节或字节数组的方式向本地内存缓存区写入数据,同时存储接口模块启动一个计时器,若计时器计时超过用户设定的未写超时时间或用户关闭了该输出流操作对象,则存储接口模块关闭计时器,关闭输出流,存储接口模块根据存储标识符进行识别,根据识别结果分别进行步骤(10‑4‑1)或(10‑4‑2),若计时器计时在用户设定的未写超时时间内,且用户写入的数据将本地内存缓存区填满时,存储接口模块对存储标识符进行识别:(10‑4‑1)若存储标识符标识的是列,则存储接口模块从键值库中读取存储标识符标识的列的数据,将本地内存缓存区数据追加到原列数据,形成新的列数据,将该新的列数据写入存储标识符标识的列中,置本地内存缓存区数据为空,重复步骤(10‑4);(10‑4‑2)若存储标识符标识的是文件,则存储接口模块将本地内存缓存区数据写入当前数据块的内容数据行的数据列中,确定下一数据块的行键,将下一数据块的行键写入当前数据块的内容数据行的下一数据块行键列中,将下一数据块置为当前数据块,创建当前数据块行键所指示的内容数据行,将当前数据块的内容数据行的下一数据块行键列置为“文件结尾”,将本地内存缓存区数据置为空,重复步骤(10‑4),(11)当存储接口模块接到用户字节下载命令及相应的存储标识符时,存储接口模块对存储标识符进行识别,若存储标识符标识的是文件、文件夹、表格、行或列簇,则向用户返回“不支持”信息;若存储标识符标识的是列,则存储接口模块对键值库进行查询,若键值库中不存在存储标识符标识的列,则向用户返回一个空字节数组;若键值库中存在存储标识符标识的列,则从键值库中读取存储标识符标识的列数据,并将该列数据存入字节数组中,向用户返回该字节数组;(12)当存储接口模块接到用户本地路径下载命令及相应的存储标识符、本地路径时, 存储接口模块对存储标识符进行识别:(12‑1)若存储标识符标识的是表格、行、列簇或列,则向用户返回“不支持”信息;(12‑2)若存储标识符标识的是文件或文件夹,则存储接口模块对存储标识符和本地路径进行识别:(12‑2‑1)若存储标识符标识的是文件,且本地路径指示的是已经存在的文件或文件夹,则向用户返回“本地文件/文件夹已经存在”信息;(12‑2‑2)若存储标识符标识的是文件,且本地路径指示的文件不存在,则根据本地路径创建本地文件,存储接口模块从键值库中读出存储标识符标识的文件元数据行中的第一个数据块的行键,将第一个数据块设为当前数据块,通过当前数据块的行键读取当前数据块的内容数据,并将当前数据块的内容数据追加到本地文件内容中,再读取当前数据块的内容数据行,获得下一个数据块的行键,再将下一个数据块置为当前数据块,重复上述读取数据块内容、追加本地文件内容、读取下一数据块行键、设置当前数据块的操作直到当前数据块的下一数据块行键列数据为“文件结尾”时,向用户返回“成功”信息;(12‑2‑3)若存储标识符标识的是文件夹,且本地路径指示的是已经存在的文件,或存储标识符标识的是文件夹,且本地路径加标识符标识的文件夹名称形成的新路径指示的是已存在的本地文件或文件夹,则向用户返回“本地文件/文件夹已经存在”信息;(12‑2‑4)若存储标识符标识的是文件夹,且不存在本地路径指示的文件或文件夹,则存储接口模块在本地创建本地路径指示的文件夹,并在本地路径指示的文件夹下创建以标识符标识的文件夹名称命名的文件夹,存储接口模块从键值库中读取存储标识符标识的文件夹元数据行的“子文件路径i”或“子文件夹路径i”(i=1,2,..,n)各列数据,并重复步骤(12‑2),下载该文件夹的所有子文件和子文件夹,并向用户返回“成功”信息;(13)当存储接口模块接到流下载命令及相应的存储标识符时,存储接口模块对存储标识符进行识别:(13‑1)若存储标识符标识的是表格,则存储接口模块向用户返回“不支持”信息;(13‑2)若存储标识符标识的是列,则存储接口模块对存储标识符标识的列进行判断,若键值库中不存在存储标识符标识的列,则向用户返回“列不存在”信息,若键值库中存在存储标识符标识的列,则从键值库中将存储标识符标识的列数据下载到本地内存缓存区中,并打开一个输入流,向用户返回该输入流操作对象;(13‑3)若存储标识符标识的是文件,存储接口模块对存储标识符标识的文件进行判断,若键值库中不存在存储标识符标识的文件,则向用户返回“文件不存在”信息,若键值库中存在存储标识符标识的文件,则存储接口模块从键值库中读取该文件元数据行,以获得第一个数据块的内容数据行的行键,将第一个数据块置为当前数据块,使用当前数据块的行键读取其内容数据行的数据列中的数据,存入本地内存缓存区中,并打开一个输入流,向用户返回该输入流操作对象;(13‑4)若存储标识符标识的是文件夹,存储接口模块对存储标识符标识的文件夹进 行判断,若键值库中不存在存储标识符标识的文件夹,则向用户返回“文件夹不存在”信息,若键值库中存在存储标识符标识的文件夹,则存储接口模块从键值库中读取该文件夹元数据行的“子文件路径i”或子文件夹路径i”(i=1,2,..,n)各列数据,并存入本地内存缓存区中,打开一个输入流,向用户返回该输入流操作对象;(13‑5)若存储标识符标识的是列簇,存储接口模块对存储标识符标识的列簇进行判断,若键值库中不存在存储标识符标识的列簇,则向用户返回“列簇不存在”信息,若键值库中存在存储标识符标识的列簇,则存储接口模块从键值库中读取列簇的所有列及列数据,并存入本地内存缓存区中,打开一个输入流,向用户返回该输入流操作对象;(13‑6)若存储标识符标识的是行,存储接口模块对存储标识符标识的行进行判断,若键值库中不存在存储标识符标识的行,则向用户返回“行不存在”信息,若键值库中存在存储标识符标识的行,则存储接口模块从键值中读取表格定义的列簇列表,并存入本地内存的缓存区中,依次对上述列簇列表中的每一列簇,重复步骤(13‑5),但在用户使用输入流操作对象时不向用户返回“读取完毕”信息,直到遍历列簇列表中的所有列簇,向用户返回“读取完毕”信息;(13‑7)用户使用输入流操作对象进行读取时,输入流操作对象对存储标识符进行识别:(13‑7‑1)若存储标识符标识的是列,则输入流操作对象以字节或字节数组的方式将数据从本地内存缓存区中读出,输入流的初始读取位置是0,用户每读取一个字节或由n个字节组成的字节数组,读取位置加1或加n,直到读取位置与本地内存缓存区数据字节数相同时,则向用户返回“读取完毕”信息;(13‑7‑2)若存储标识符标识的是文件,则输入流操作对象以字节或字节数组的方式将数据从本地内存缓存区中读出,输入流的初始读取位置是0,用户每读取一个字节或由n个字节组成的字节数组,读取位置加1或加n,直到读取位置与本地内存缓存区数据字节数相同时,读取当前数据块的内容数据行,以获得下一个数据块的行键,将下一个数据块置为当前数据块,使用当前数据块的行键读取其内容数据行的数据列中的数据,存入本地内存缓存区中,重复上述步骤,直到读取当前数据块的内容数据行的下一数据块行键列为“文件结尾”时,向用户返回“读取完毕”信息;(13‑7‑3)若存储标识符标识的是文件夹,则输入流操作对象从本地内存缓存区中读取下一子文件或子文件夹路径,并向用户返回下一子文件或子文件夹路径,当所有子文件或子文件夹路径已经读取完成时,向用户返回“读取完毕”信息;(13‑7‑4)若存储标识符标识的是列簇,则输入流操作对象从本地内存缓存区中读取下一列,并向用户返回下一列的名称及数据,当所有列已经读取完成时,向用户返回“读取完毕”信息。
地址 100084 北京市海淀区清华园1号