如何扫描这一行并使用scan.skip()?

How to scan this line and use scan.skip()?

我有一个 .txt 文件,其中包含以下格式示例的行:torch ; 3.0 ; 23.0

我想扫描它以便将第一项放在字符串中,将第二项和第三项放在浮点数中。

这是我目前所做的,但 scan.skip(" ; ") 不起作用,我也尝试过 scan.skip(Pattern.compile(" ; ") 但它也不起作用。

File file = new File(dir);
    try {
        Scanner scan = new Scanner(file);
        scan.skip(" ; ");
        scan.useDelimiter(Pattern.compile(" ; "));
        while (scan.hasNextLine()) {
            String s = scan.next();
            float f1 = scan.nextFloat();
            float f2 = scan.nextFloat();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

你有什么解决办法吗? 谢谢

不要更改用于阅读 FileScanner 的分隔符。相反,实例化一个内部 Scanner 来解析您从文件中读取的行。另外,我会使用 try-with-Resources 来确保 Scanner(和 File)已关闭。喜欢,

File file = new File(dir);
try (Scanner scan = new Scanner(file)) {
    while (scan.hasNextLine()) {
        Scanner lineScan = new Scanner(scan.nextLine());
        lineScan.useDelimiter(Pattern.compile("\s*;\s*"));

        String s = lineScan.next();
        float f1 = lineScan.nextFloat();
        float f2 = lineScan.nextFloat();
        System.out.printf("%s %.2f %.2f%n", s, f1, f2);
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

你可以使用;\n作为分隔符,不需要跳过,我也建议使用Float.parseFloat(scan.next());

Scanner scan = new Scanner(file);
scan.useDelimiter(Pattern.compile("[;\n]"));
while (scan.hasNextLine()) {
    String s = scan.next();
    float f1 = Float.parseFloat(scan.next());
    float f2 = Float.parseFloat(scan.next());
    System.out.println(s + " " + f1 + " " + f2);
}

提供的答案 or 将解决您的问题。

不过,我想解释一下为什么 你的代码 不起作用,你如何让它起作用。

Have a lookScanner#skip(String pattern) 文档中说:

If a match to the specified pattern is not found at the current position, then no input is skipped and a NoSuchElementException is thrown.

因此,您的 scan.skip(" ; "); 阻塞线程,并继续读取标记,直到 您的输入匹配指定模式 (;) 以跳过,或抛出 NoSuchElementException

如果您想使用 .skip(..),您只需更改方法调用的顺序即可,例如:

try {
    Scanner scan = new Scanner(file);
    while (scan.hasNextLine()) {
        String s = scan.next();
        scan.skip(" ; ");
        float f1 = scan.nextFloat();
        scan.skip(" ; ");
        float f2 = scan.nextFloat();
    }
}