从导出的.jar运行时,扫描程序会随机停止读取,但从Eclipse运行时则不会

时间:2015-04-05 12:09:09

标签: java eclipse java.util.scanner

所以今天我在使用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存档相同的工作目录(因为它有一些数据子目录):

  1. 采用相同的.gz存档
  2. 从.gz
  3. 中提取文件
  4. 阅读上面显示的文件
  5. 不确定它是否有帮助,但Eclipse已设置为以UTF-8格式保存源文件。

    提前致谢

1 个答案:

答案 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时要使用的文件的编码。