所以今天我在使用java Scanner时遇到了一些麻烦。我在项目中多次使用Scanner类,我从未遇到过任何问题。
基本上,我总是做这样的事情:
try (Scanner scanner = new Scanner(file)) {
while(scanner.hasNextLine()) {
String line = scanner.nextLine();
...
}
} catch ...
} finally ...
并且扫描仪工作正常,因为它只是一些简单的代码。但是,今天我使用上面的代码来读取大约17000行的文本文件。
首先,代码工作得很好(当通过Eclipse运行时),但是在导出项目之后,扫描器将在大约400行后停止读取。
我用Google搜索了一下,最后由于这些答案我解决了问题:
我所要做的就是从
更改构造函数Scanner scanner = new Scanner(file)
到
Scanner scanner = new Scanner(new FileInputStream(sql)))
这是一些奇怪的编码问题,我明白了。但是为什么当我从Eclipse运行代码时,它工作得很完美,当我从导出的jar中运行它时,Scanner在读完大约400行之后就停止了?
代码在两种情况下完全相同,因为我设置Eclipse以便它使用与导出的.jar存档相同的工作目录(因为它有一些数据子目录):
不确定它是否有帮助,但Eclipse已设置为以UTF-8格式保存源文件。
提前致谢
答案 0 :(得分:2)
但是为什么当我从Eclipse运行代码时,它工作得很完美,当我从导出的jar中运行它时,Scanner在读完大约400行后停止了?
Scanner
有两个不同的构造函数接受File
作为参数。来自docs:
扫描仪(文件来源)
使用基础平台的默认字符集将文件中的字节转换为字符。
和
扫描程序(文件来源,字符串charsetName)
使用指定的字符集将文件中的字节转换为字符。
因此,如果您未指定charsetName
,它将使用环境的默认字符集。
在Eclipse之外运行项目时的环境编码可能不是UTF-8。要检查是否是这种情况,您可以编写一个这样的简单程序:
class CheckDefaultCharset {
public static void main(String... args) {
System.out.println(Charset.defaultCharset());
}
}
并在两种环境中运行。
例如,当从Eclipse运行上面的代码时,我得到:
UTF-8
当在PowerShell(Windows 7)中运行时,我得到:
windows-1252
为避免此类问题,最好始终指定在使用Scanner
时要使用的文件的编码。