Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从exported.jar运行时,扫描程序会停止随机读取,但从Eclipse运行时不会_Java_Eclipse_Java.util.scanner - Fatal编程技术网

Java 从exported.jar运行时,扫描程序会停止随机读取,但从Eclipse运行时不会

Java 从exported.jar运行时,扫描程序会停止随机读取,但从Eclipse运行时不会,java,eclipse,java.util.scanner,Java,Eclipse,Java.util.scanner,所以今天我在使用java扫描器时遇到了一些麻烦。我在项目中多次使用Scanner类,从未遇到任何问题 基本上,我总是这样做: try (Scanner scanner = new Scanner(file)) { while(scanner.hasNextLine()) { String line = scanner.nextLine(); ... } } catch ... } finally ... class CheckDefaultCha

所以今天我在使用java扫描器时遇到了一些麻烦。我在项目中多次使用Scanner类,从未遇到任何问题

基本上,我总是这样做:

try (Scanner scanner = new Scanner(file)) {
    while(scanner.hasNextLine()) {
        String line = scanner.nextLine();
        ...
    }
} catch ...
} finally ...
class CheckDefaultCharset {
    public static void main(String... args) {
        System.out.println(Charset.defaultCharset());
    }
}
扫描仪工作正常,因为它只是一些简单的代码。然而,今天,我使用上面的代码来读取大约17000行的文本文件

起初,代码工作得很好(通过Eclipse运行时),正如我所期望的那样,但是在导出项目后,扫描仪将在大约400行之后停止读取

我在谷歌上搜索了一下,最后我解决了这个问题,多亏了这些答案:

我所要做的就是将构造函数从

Scanner scanner = new Scanner(file)

这是一个奇怪的编码问题,我明白了。但是,为什么当我从Eclipse运行代码时,它工作得毫无瑕疵,而当我从导出的jar运行代码时,扫描仪在读取了大约400行后停止了

在这两种情况下,代码的作用完全相同,因为我设置了Eclipse,以便它使用与导出的.jar存档相同的工作目录(因为它有一些数据子目录):

  • 接受相同的.gz存档
  • 从.gz文件中提取一个文件
  • 像上面显示的那样阅读文件
  • 不确定它是否有用,但Eclipse已设置为以UTF-8格式保存源文件

    提前谢谢

    但是,为什么当我从Eclipse运行代码时,它工作得毫无瑕疵,而当我从导出的jar运行代码时,扫描仪在读取了大约400行后停止了

    Scanner
    有两个不同的构造函数,它们接受
    文件作为参数。从:

    扫描仪(文件源)

    使用底层平台的默认字符集将文件中的字节转换为字符

    扫描仪(文件源,字符串字符集名称)

    使用指定的字符集将文件中的字节转换为字符

    因此,如果不指定
    字符集名称
    ,它将使用环境的默认字符集

    在Eclipse之外运行项目时的环境编码可能不是UTF-8。要检查这种情况,您可以编写如下简单程序:

    try (Scanner scanner = new Scanner(file)) {
        while(scanner.hasNextLine()) {
            String line = scanner.nextLine();
            ...
        }
    } catch ...
    } finally ...
    
    class CheckDefaultCharset {
        public static void main(String... args) {
            System.out.println(Charset.defaultCharset());
        }
    }
    
    并在两种环境中运行它

    例如,从Eclipse运行上述代码时,我得到:

    UTF-8
    
    在PowerShell(Windows 7)中运行时,我会:


    为了避免此类问题,最好在使用
    扫描仪时始终指定要使用的文件的编码。我认为这是某种环境变量问题,并且知道Scanner有第二个参数,但我从未想过使用它,因为我从来没有遇到过任何问题。最后,这只是一个简单而愚蠢的问题。谢谢!很乐意帮忙!别担心,编码问题很常见。