Scala的包含String类的方法在末尾找不到带有新行的字符串。为什么?

时间:2016-02-28 20:54:27

标签: scala io character-encoding

我有一个包含以下内容的txt文件:

  

ABC

我用记事本制作了文件并将其保存为UTF-8。使用Scala Interpreter中的"abc"调用以下函数会生成false该函数使用字符串+最终字符文件搜索txt文件。

def isWordKnown(word: String):Boolean={
    val inputStreamFromKnownWordsList=new FileInputStream("D:\\WordTracker\\new english\\test.txt")

    var stringWriter=new StringWriter()
    IOUtils.copy(inputStreamFromKnownWordsList,stringWriter,"UTF-8")
    val knownWordsString=stringWriter.toString()
    val endOfLine=knownWordsString.substring(knownWordsString.length()-1, knownWordsString.length())
    return knownWordsString.contains(word+endOfLine)
  }

2 个答案:

答案 0 :(得分:2)

错误是你假设EOL的长度是一个char。在Windows上它是两个字符。

try
{
    /// ...
}
catch (Exception ex)
{
    if (ex is ArgumentException)
    {
        /// handle known or specific exceptions here
    }
    else 
    {
        /// log then rethrow unhandled exceptions here
        logExceptions(ex);
        throw;  
    }
}

EOL长度为scala> val data = "abc\r\n" data: String = "abc " scala> val end = data.substring(data.length - 1, data.length) end: String = " " scala> data.contains("abc" + end) res0: Boolean = false

您也可以查看

scala.util.Properties.lineSeparator.length

答案 1 :(得分:1)

你的方法对你想要的东西来说太复杂了。此外,它不是真正的scala惯用语(使用returnvar?)

看看这个例子:

def isWordKnown(word: String): Boolean = {
    val lines = scala.io.Source.fromFile("path/file.txt").mkString
    lines.contains(word)
}

我得到了:

scala> isWordKnown("abc")
res1: Boolean = true

由于您正在使用Windows并谈论文件编码,请在println之前检查scala获取的文件内容(简单lines.contains(word)