2

我有 2 个关于 Scala 类的问题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?!

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

谢谢你的帮助 :-)

4

1 回答 1

1

pos返回由 返回的最后一个字符的位置next(),但诀窍是位置是由位置的编码器 ( scala.io.Position)编码的行和列的组合Integer

对象 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)

PSSource旨在将数据作为字符流读取,因此它为您提供诸如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)
于 2017-04-03T06:45:10.797 回答