2010-07-27 64 views
2

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

getLines'评论说:

返回线(不包括换行符(S))[...]如果你需要更精致的行为,那么可以继承源#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,并且一直在Google上搜索,没有运气。

任何建议将受到感谢。谢谢。

回答

2

由于您可能继承scala.io.Source本身,为什么不重写getLines()方法并返回您的类不重写LineIterator,而是提供您需要的完全功能?毫无疑问,评论是误导性的。

+0

是的,我想我要带你建议的方法。谢谢。 – owst 2010-07-30 11:26:46

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, "###")) 
    } 
}