在Scala中计算文件的行

时间:2014-01-05 14:13:33

标签: scala file-io newline standard-library

我现在正在研究Scala,这是我的代码片段,用于计算文本文件中的行数。

  //returns line number of a file
  def getLineNumber(fileName: String): Integer = {
    val src = io.Source.fromFile(fileName)
    try {
      src.getLines.size     
    } catch {
      case error: FileNotFoundException => -1
      case error: Exception => -1
    }
    finally {
      src.close()
    }
  }

我正在使用Programming in Scala book中解释的Source.fromFile方法。问题出在这里:如果我的文本文件是这样的:

baris

ayse


deneme

我得到了正确的结果6.如果我在单词 deneme 之后按回车,我仍然得到数字6,但是在这种情况下我检查了7。按下输入后按空格键,我得到7,这是正确的。这是Scala标准库中的错误还是更多可能是我遗漏了什么?

最后,我的基本主要方法如果有帮助:

  def main(args: Array[String]): Unit = {
    println(getLineNumber("C:\\Users\\baris\\Desktop\\bar.txt"))
  }

2 个答案:

答案 0 :(得分:3)

如果您在单词 deneme 之后按Enter键,只需在第6行添加行尾序列(CR + LF,在您的情况下)。您会看到光标转到新行,但您没有创建新行:您只需指定第六行已结束。要创建新行,您必须在行结束序列之后放置一个字符,就像按空格键时一样。

答案 1 :(得分:3)

它使用java.io.BufferedReaderreadLine。以下是该方法的来源:

/**
 * Reads a line of text.  A line is considered to be terminated by any one
 * of a line feed ('\n'), a carriage return ('\r'), or a carriage return
 * followed immediately by a linefeed.
 *
 * @return     A String containing the contents of the line, not including
 *             any line-termination characters, or null if the end of the
 *             stream has been reached
 *
 * @exception  IOException  If an I/O error occurs
 *
 * @see java.nio.file.Files#readAllLines
 */
public String readLine() throws IOException {
    return readLine(false);
}

这称之为:

...
* @param      ignoreLF  If true, the next '\n' will be skipped
...
String readLine(boolean ignoreLF) ...
...
/* Skip a leftover '\n', if necessary */
            if (omitLF && (cb[nextChar] == '\n'))
                nextChar++;
            skipLF = false;
            omitLF = false;

基本上就是它的实现方式。我想这取决于一条线对你意味着什么。你在计算包含某些东西或新行字符的行吗? - 显然是不同的事情。