Hadoop官网翻译 【FileSystem/FSDataInputStream】

DataInputStream,特别是FSDataInputStream(FSDIS),提供了一种线程安全的方式来读取文件。它支持定位读取(PositionedReadable),允许调用者指定偏移量进行读取。虽然FSDIS在读取过程中保持文件源不变,但其内容在读取期间不应变。read方法是阻塞的,直到读取到目标长度或所有数据。seek方法用于改变读取位置,而seekToNewSource在副本可用时用于切换读取源。FSDIS的一致性并不保证在读取过程中对基础数据的修改立即可见。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DataInputStream

  • 数据源是local或者remote文件系统
  • 正在读取的流引用有限的字节数组
  • data的长度/内容在读取的过程中不发生变化
  • 读取的过程中,源文件仍存在
  • 调用方可以指定偏移量
  • 不要求读的线程安全
  • PositionedReadable需要线程安全
    支持的语法是有
  • pos(FSDIS)
    获取FSDataInputStream的位置
  • data(FSDIS)
  • isOpen(FSDIS)

close

close支持幂等

getPos

返回当前的位置,如果流关闭时未定义

read

  • close关闭的话,读取会失败
  • 没有定义read需要多长时间

read(buffer[],offset,length)

阻塞读,直到返回目标长度的内容,或者已经获取了所有数据。

seek

从指定位置查找
目前需要对象存储实现了懒seek,在真正读之前使用以前的长度,存在情况等信息。

seekToNewSource

从不同源读取,在副本数大约1时有效。

CanUnbuffer.unbuffer()

解除缓冲,套接字,文件描述符等。之后的其他IO操作需要重新获取这些资源。

  • 子类除了实现CanUnbuffer之外,需要实现StreamCapability接口。
  • 可以对正在读取的文件执行该操作,但是结果没有定义。

PositionedReadable(Pread)

这里面我是不是可以理解,一个FSDIS对应一个Position,读取需要线程安全?每次读取之后,需要seek(0)?

相当于seekable.find之后再进行read,但是只有一个方法调用。
接口声明PositionedReadable是线程安全的。

PositionReadable.read(postion,buffer,offset,length)

将尽可能多的数据读入分配给它的缓冲区空间。

还有一部分类似的,这里不翻译了。

一致性

FSDIS的所有读取器,打开时接收到FS.Files[p]的数据访问
如果读取过程更改了基础数据,不一定可见.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值