2017-04-02 90 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)