我有以下scala程序,只计算文件中的单词:
package com.impatient
import java.util.Scanner
object Main extends App {
countWords()
def countWords(): Unit = {
val in = new Scanner(new java.io.File("C:\\tmp\\SampleText.txt"))
var wc = 0
while (in.hasNext()) {
var word = in.next()
wc += 1
println( wc + ". " + word)
}
in.close()
println("======================")
println(s"Total words: $wc")
}
def TestFunction(): Unit ={
println("Hello from test function!")
}
TestFunction()
}
当我在intellij中直接或通过intellij中的sbt shell执行此操作时,我得到以下输出:
- 大多
- 正:
======================
总字数:309 你好测试功能!
所以它正确计算文本文件中的309个单词。
但是,如果我尝试执行我刚刚用intellij编译的jar,直接通过scala
或sbt
我得到以下输出:
λscala。\ impatientscala2_2.12-1.0.jar
======================
总字数:0 你好测试功能!
所以在这种情况下,尽管执行了Main
中的方法,但wordcount为0。
为什么会这样呢? intellij引用其他一些独立的sbt或scala不是的java库吗?在那种情况下,为什么Scanner
不会失败?
编辑1
我已将此回购克隆到另一台PC,看看会发生什么。在那种情况下,我可以观察到完全相反的,即:
0 wordcount是由于没有处理while
循环,因为in.hasNext()不返回任何内容。
我通过使用Paths.get
的java.nio.file._
找到了解决方法。
//val in = new Scanner(new java.io.File("C:/tmp/SampleText.txt"))
val in: Scanner = new Scanner(Paths.get("C/tmp/SampleText.txt"))
当使用Run |时,这会在两台PC上生成正确的jar Intellij中的Sbt Task,在intellij中使用SBT Shell,并使用独立的SBT shell。如果有人能够解释为什么java.io.File
在某些设置中失败会很好。