如何将 Scanner 类转换为 String?

How can I convert Scanner Class into String?

提问人:Pramod Devrath 提问时间:10/31/2023 最后编辑:OneCricketeerPramod Devrath 更新时间:11/1/2023 访问量:70

问:

import java.util.Scanner;
public class Cond { 
    static ScannerClass usrID, pwdd;
    static String pass = "123456";
    static String usr = "ABCD";
    public static void main(String[] args) {
       
        System.out.println("Enter UserID: ");
        usrID = new ScannerClass();
        
        usrID.main();
        String o = usrID.toString();
        System.out.println("Enter password: ");
        pwdd = new ScannerClass();
        pwdd.main1();
        String t = pwdd.toString();

        
        if ((usr.equals(o)) && (pass.equals(t))) {
            System.out.println("You are logged in!");
        }
        else {
            System.out.println(("Please enter correct credentials"));
        }
    }
}

我做了一个单独的类,它是:

import java.util.Scanner;


public class ScannerClass {
    static Scanner sc = new Scanner(System.in);
    public  void main(){
        
        String UserID = sc.nextLine();
    }
    public void main1(){
        String pwd = sc.nextLine();
    }
}

代码没有像我预期的那样重新出现.这就是问题所在:


输入用户 ID: ABCD公司 输入密码: 123456 请输入正确的凭据


我尝试使用 toString() 转换 Scanner 类,我在 internt 上发现了这个,但它不起作用,如您在上面的结果中看到的那样。

java.util.scanner

评论


答:

0赞 enzo 10/31/2023 #1

里面的方法从用户那里读取,创建一个局部变量及其内容,然后丢弃该变量。方法中的第一个变化是返回局部变量,以便您可以在其他位置访问它:mainScannerClass

public class ScannerClass {
    static Scanner sc = new Scanner(System.in);

    public String getUserId(){
        String UserID = sc.nextLine();
        return UserID;
    }

    public void getPassword(){
        String pwd = sc.nextLine();
        return pwd;
    }
}

然后,在您的主要方法中,您可以做到Cond

ScannerClass scanner = new ScannerClass();
        
System.out.println("Enter UserID: ");
String usrID = scanner.getUserId();

System.out.println("Enter password: ");
String pwd = scanner.getPassword();

if ((usr.equals(usrID)) && (pass.equals(pwd))) {
    System.out.println("You are logged in!");
} else {
    System.out.println(("Please enter correct credentials"));
}
0赞 OneCricketeer 10/31/2023 #2

ScannerClass 没有构造函数,因此调用它不会执行您想要的操作(设置该类中的任何变量)。此外,您还需要更详细地了解变量范围。new

相反,您需要 getter 方法

import java.util.Scanner;

public class ScannerClass {
    private final Scanner sc; 

    public ScannerClass() {
        this.sc = new Scanner(System.in);
    } 
    
    public String getUserID(){
        return sc.nextLine();
    }

    public String getPwd(){
        return sc.nextLine();
    }
}

然后,在您的主要方法中,您只需要一个扫描仪

ScannerClass sc = new ScannerClass();
String uid = sc.getUserID();
String pwd = sc.getPwd();

(注意:这两种方法返回完全相同的东西,因此创建一个新对象,只是为了重命名,通常被认为是不好的做法)Scanner.nextLine

这已经是一个字符串了。我不知道你为什么要在 String 上调用 toString,但在 ScannerClass 对象上调用它是不正确的(打印输出,你就会明白为什么)

-1赞 NoDataFound 10/31/2023 #3

您没有正确使用该类:您的 ScannerClass 或多或少是无用的,因为您所做的只是使用一个实例。Scannerstatic Scanner

你宁愿这样做:

 public static void main(String[] args) {
   Scanner scanner = new Scanner(System.in); // 1
   System.out.println("Enter UserID: ");       
   String o = scanner.nextLine(); // (2)
   System.out.println("Enter password: ");
   String t = scanner.nextLine(); // (3)
   if (usr.equals(o) && pass.equals(t)) {
     System.out.println("You are logged in!");
   } else {
     System.out.println("Please enter correct credentials");
   }
 }
  1. 您通常应该在此处使用 try with resource,尤其是在您持有资源的情况下。这样可以避免处理泄漏,在特定情况下,这问题较少,甚至更罕见。System.in
  2. 我们使用 nextLine() 以用户身份获取下一行,但如果有新的下一行,这可能会失败:您通常应该调用 before: may fails 例如,如果 stdin 不再在这里(结束 文件等)hasNextLine()nextLine()
  3. 请参见 2。

由于您正在读取密码,因此您也可以使用隐藏密码的好处,但它在IDE(如Eclipse)中可能无法很好地工作:Console

Console cons = System.console()
if (cons == null) {
  throw new IllegalStateException("no console");
}
String o = cons.readLine("Enter UserID: ");
char[] t = cons.readPassword("Enter Password: ");
if (usr.equals(o) && t != null && Arrays.equals(pass.toCharArray(), t)) {
  System.out.println("You are logged in!");
} else {
  System.out.println("Please enter correct credentials");
}

如果你想保留你的 ScannerClass,那么你最好有一个静态方法从用户那里获取所有信息:

class ScannerClass  {
  private final String userId;
  private final String password;
  private ScannerClass(String userId, String password) {
    this.userId = userId;
    this.password = password;
  }
  
  public String getUserId() {return userId;}
  public String getPassword() {return password;}

  static ScannerClass  obtainFrom(/*WontClose*/ InputStream is) { // (1)
    Scanner scanner = new Scanner(is);
    System.out.println("Enter UserID: ");       
    String o = scanner.nextLine();
    System.out.println("Enter password: ");
    String t = scanner.nextLine();
    return new ScannerClass(o, t);
  }
}

请注意,我们不会关闭 (1) 实例,因为 Scanner.close 将关闭 ,这可能是需要的,也可能不需要。ScannerInputStream

然后,您可以使用它:

ScannerClass scanner = ScannerClass.obtainFrom(System.in);
String o = scanner.getUserId();
String t = scanner.getPassword();

这样做的好处是将关注点分开:获取信息和 ScannerClass 所述信息。obtainFrom

评论

1赞 Sören 11/1/2023
投了反对票,因为这包含不好的建议。不应将 try-with-resources 用于从 System.in 创建的扫描程序。关闭 Scanner 会关闭内部 InputStream,这将导致 System.in 的令人讨厌的意外。
0赞 NoDataFound 11/1/2023
正如我所说,这问题不大,但它仍然是:在 Java 中使用 System.in 是,在大多数情况下,您将使用适当的基于文件。无论如何,固定了答案......System.inInputStream