在Scala 2.7中读取文件的行,保留行终止符

时间:2010-07-27 20:05:47

标签: scala

scala.io.Source的getLines()方法从它返回的行中剥离\ r和\ n。我反而希望将这些字符保留在返回的字符串中。

getLines的评论说:

  

返回行(不包括换行符)[...]如果你需要更精细的行为,你可以继承Source#LineIterator

我试图将LineIterator子类化,但我遇到了麻烦(可能还有一些误解!)。

我想要类似的东西:

class FullLineIterator() extends LineIterator {   
    // Don't strip \r?\n
    override def getc() = iter.hasNext && {
        val ch = iter.next
        if (ch == '\n') { 
            sb append ch
            false
        } else if (ch == '\r') {            
            sb append ch

            if (iter.hasNext && iter.head == '\n') {
                iter.next
                sb append iter.head
            }

            false
        } else {
            sb append ch
            true
        }
    }
}

但我遇到了几个主要问题:
1)找不到类型LineIterator,即使我有导入scala.io.Source._
2)我很确定我无法访问sb,因为它是LineIterator中的私有[this]。

有没有人想要这样做?这是一件相当奇怪的事情,但我确实想这样做:)。

我偷看了scalax并且谷歌搜索了一段时间,没有运气。

我们将非常感激地收到任何建议。感谢。

2 个答案:

答案 0 :(得分:2)

既然你可能是scala.io.Source本身的子类,为什么不覆盖getLines()方法并返回你的类而不是重写LineIterator,但是提供你需要的功能呢?毫无疑问,评论是误导。

答案 1 :(得分:0)

单向具有自定义行分隔符

import scala.io.Source

object EdiSource {
  class SegIterator(val it: Iterator[Char], sep: Char) extends Iterator[String] {
    val sb = new StringBuilder
    def hasNext = it.hasNext
    def next = {
      sb.clear
      var ch: Char = 0
      while (it.hasNext && { ch = it.next; ch } != sep) sb.append(ch)
      sb.toString
    }
  }
  def fromFile(path: String, sep: Char = ' ') = new SegIterator(Source.fromFile(path), sep)
}

object Main {
  def main(args: Array[String]): Unit = {
    EdiSource.fromFile("Z:\\input.txt", 'i').foreach(line => println("###", line, "###"))
  }
}