Scala';s包含字符串类的方法不';找不到结尾有新行的字符串。为什么?

Scala';s包含字符串类的方法不';找不到结尾有新行的字符串。为什么?,scala,io,character-encoding,Scala,Io,Character Encoding,我有一个包含以下内容的txt文件: abc 我用记事本制作了这个文件,并将它保存在UTF-8中。从Scala解释器调用带有“abc”的以下函数将产生false该函数使用字符串+文件的最后一个字符搜索txt文件 def isWordKnown(word: String):Boolean={ val inputStreamFromKnownWordsList=new FileInputStream("D:\\WordTracker\\new english\\test.txt")

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

abc

我用记事本制作了这个文件,并将它保存在UTF-8中。从Scala解释器调用带有
“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)
  }

你的方法对你来说太复杂了。而且,它也不是真正的scala惯用语(使用
返回
变量
?)

看看这个例子:

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并讨论文件编码,请检查scala在
行之前获取的文件内容(一个简单的
println
)。包含(word)
您的方法太复杂了,无法满足您的需要。而且,它也不是真正的scala惯用语(使用
返回
变量
?)

看看这个例子:

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并讨论文件编码,请检查scala在
行之前获取的文件内容(简单的
println
)。contains(word)

错误在于您假设EOL的长度为一个字符。在Windows上是两个字符

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

你也可以检查一下

scala> data.endsWith("abc" + util.Properties.lineSeparator)
res1: Boolean = true

错误在于您假设EOL的长度为一个字符。在Windows上是两个字符

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

你也可以检查一下

scala> data.endsWith("abc" + util.Properties.lineSeparator)
res1: Boolean = true
或者
fromFile(f).getLines exists(uendswith word)
如果目的是检查一行是否以单词结尾。或者
fromFile(f).getLines exists(endsWith word)
如果目的是检查一行是否以单词结尾。另请参阅