2017-04-02 46 views
2

我对Scala的BufferedSource类2个问题。斯卡拉BufferedSource位置

我怎么能查询当前阅读位置?

pos试了一下:

object testapp extends App { 

val doc = scala.io.Source.fromFile("text.txt") 

println(doc.pos) 
doc.next() 
println(doc.pos) 
doc.next() 
println(doc.pos) 
} 

输出:

0 
2049 
2050 

为什么它从0跳到2049?!

是否有另一种方法来查询位置和/或将它设置在别的地方?

感谢您的帮助:-)通过next()返回最后一个字符的

回答

1

pos回报的位置,但诀窍是,位置是作为一个单一的Integer通过位置的编码器(scala.io.Position)编码的行和列的组合:

对象位置提供了便利的方法来编码行 和列号在一个单一的整数。编码线路* (列)的数字范围从0到LINE_MASKCOLUMN_MASK),* 其中0表示该行(列)是未定义和* 1 表示的第一行(列)...

https://github.com/scala/scala/blob/v2.11.8/src/library/scala/io/Position.scala

http://www.scala-lang.org/api/2.11.8/#scala.io.Source $ RelaxedPosition $

使用Postioner为了得到更可读的信息:

当前输入和位置,以及下一个字符方法 委托给定位器。

实施例:

val doc = scala.io.Source.fromFile("aaa.txt") 
val positioner = new doc.Positioner() 
val positioned = doc.withPositioning(positioner) 
positioned.next() 
scala> positioner.cline -> positioner.ccol 
res15: (Int, Int) = (1,2) 
positioned.next() 
scala> positioner.cline -> positioner.ccol 
res17: (Int, Int) = (1,3) 

P.S. Source是用于读取数据的字符流,因此它为您提供便利设施,如getLines()等,所以基本上这就是为什么Positioner作品行和列,而不是一个绝对位置。

如果你需要一个Iterator返回你的每一个字符的绝对位置,使用zipWithIndex

scala> val doc = scala.io.Source.fromFile("aaa.txt").zipWithIndex 
doc: Iterator[(Char, Int)] = non-empty iterator 

scala> doc.next() 
res38: (Char, Int) = (a,0) 

scala> doc.next() 
res39: (Char, Int) = (a,1) 

scala> doc.next() 
res40: (Char, Int) = (a,2) 

scala> doc.next() 
res41: (Char, Int) = (a,3) 

scala> doc.next() 
res42: (Char, Int) = 
(
,4)