You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

登录功能Scanner无法读取文件多行内容,仅识别首组账号密码求助

解决Scanner读取多组用户登录信息的问题

我看了你的代码,问题很明显——你的循环逻辑根本没机会去检查users.txt里的第二组及以后的用户!

先说说原代码的问题:

  • 你用全局的lineNo累加所有行号,第一组是行1和行2,但第二组应该是行3和行4,你的逻辑里lineNo ==1和lineNo==2只会匹配第一组
  • 只要第一组的用户名不匹配,或者用户名匹配但密码不匹配,你直接break跳出循环了,后面的用户数据连读都没读

要解决这个问题,我们应该把每两行当成一组用户信息(用户名+密码),循环读取每一组来验证,而不是按全局行号判断。下面是修正后的代码:

btLogin.setOnAction(e -> {
    boolean grantAccess = false;
    String userName = tfUsername.getText();
    String password = tfPassword.getText();
    File f = new File("users.txt");
    
    try {
        Scanner read = new Scanner(f);
        
        // 每次循环读取一组用户(用户名+密码)
        while (read.hasNextLine()) {
            // 先读取当前组的用户名
            String storedUsername = read.nextLine();
            // 检查是否还有对应的密码行,避免文件格式错误导致异常
            if (!read.hasNextLine()) {
                break;
            }
            String storedPassword = read.nextLine();
            
            // 对比输入和当前组的信息
            if (storedUsername.equals(userName) && storedPassword.equals(password)) {
                grantAccess = true;
                break; // 匹配成功,跳出循环
            }
            // 不匹配的话,继续读取下一组
        }
        
        // 这里可以加验证后的逻辑,比如跳转页面或提示信息
        if (grantAccess) {
            System.out.println("登录成功!");
        } else {
            System.out.println("用户名或密码错误");
        }
        
        read.close(); // 记得关闭Scanner
    } catch (FileNotFoundException ex) {
        ex.printStackTrace();
        System.out.println("用户文件不存在!");
    }
});

修正后的逻辑说明:

  • 每次循环先读一行作为用户名,再读一行作为密码,这样天然对应一组用户
  • 增加了read.hasNextLine()的判断,防止文件最后一行只有用户名没有密码,导致抛出NoSuchElementException
  • 只有当找到匹配的用户组时才跳出循环,否则会一直读取到文件末尾
  • 最后记得关闭Scanner,避免资源泄漏

这样修改后,不管users.txt里有多少组用户信息,都会逐一验证,直到找到匹配的或者读完所有内容。

内容的提问来源于stack exchange,提问作者jells08

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:03:26