`
langyu
  • 浏览: 883126 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多
  下面所描述的内容是根据实际需要对BufferedReader的小改进,并提供一张简图来说明所做的修改。如有更方便的方式请回帖或联系dennyy99@gmail.com给予明示,谢谢


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



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



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


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);
}



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

点此下载


  • 大小: 45.3 KB
  • 大小: 21.3 KB
分享到:
评论
1 楼 ostar005 2015-02-25  
XG君,真NB!

相关推荐

Global site tag (gtag.js) - Google Analytics