文件中行级偏移量的一种获取方式

[i]下面所描述的内容是根据实际需要对BufferedReader的小改进,并提供一张简图来说明所做的修改。如有更方便的方式请回帖或联系dennyy99@gmail.com给予明示,谢谢[/i]

[size=medium]
如果需要对文件内容建索引,就可能需要每行数据的起始偏移量。下图是文件内容索引的简明结构,目标是为了引出我们对行级偏移量的需求

[img]http://dl.iteye.com/upload/attachment/0066/4114/4fe128d2-e7f6-3504-a51e-65b7757c30c5.jpg[/img]

我们平时都是用BufferedReader来读取行内容,如果在它的基础上能提供行级偏移量岂不更好嘛,因此动手对BufferedReader的源码做了简单修改。因为BufferedReader是不断有buffer去原始的input stream获取内容,然后逐一遍历buffer来组织成行。如果想获得行的起始处,就得追踪BufferedReader对行的构造过程。我尝试过这样做,但出现过一些计算错误的问题。所以反向行之,先获取Reader读完一行后,它的行尾位置(line end position)。用行尾位置减去行的长度不就是行的起始偏移量吗?事实证明这样是一种简便有效的方式。详情见下图

[img]http://dl.iteye.com/upload/attachment/0066/4116/32d6f3a8-0ac5-3ccd-b0e4-6d6423dc1780.jpg[/img]

附件是修改后的代码,命名为PositionAwareReader,它的使用方式示例如下[/size]


PositionAwareReader reader = new PositionAwareReader(new InputStreamReader(inputStream));

String line = null;
while ((line = reader.readLine()) != null) {
long offset = reader.getNextPos() - line.length() - 1;
System.out.println("Line:" + line + ", offset:" + offset);
}


[size=medium]
获取行起始偏移量之后就可以做一些好玩的事情了。上面提到的索引是一方面,也可以实现如linux命令"grep 'keyword' file -B 10 -A 10" 这样的行为,其它的使用方式正在探索中。

[url=http://dl.iteye.com/topics/download/4b5758a0-b93e-3fa8-b391-641390c08577]点此下载[/url]


[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值