我有一个简单的问题。
我正在尝试使用java中的文本文件创建注册程序。
我写了一些代码来进行注册,但起初我的程序应该检查文本文件中是否存在用户名。
如果用户名存在,则程序会要求用户输入新用户名。
但我的代码中有一些错误我不知道,它不会检查用户名是否存在。
这是我的代码:
System.out.println("Registration Page");
System.out.println("NOTE: your username is a unique one so it cannot be changed.");
System.out.printf("Username: ");
String user = input.next();
System.out.printf("Password: ");
String pass = input.next();
System.out.printf("Confirm Password: ");
String conf = input.next();
int length = pass.length();
int passInt = Integer.parseInt(pass);
int confInt = Integer.parseInt(conf);
if(length < 6)
System.out.println("Too short password, password must be 6 characters or more");
else
{
if(passInt == confInt)
{
Scanner z = null;
try{
z = new Scanner(new File("C:\\Users\\فاطمة\\Downloads\\accounts.txt"));
boolean checkname = false;
while(z.hasNext())
{
String a = z.next();
int b = z.nextInt();
if(a == null ? user == null : a.equals(user))
checkname = true;
}
if(checkname)
System.out.println("Username is already exists and used, please type another one");
else
{
Formatter x = null;
try{
FileWriter f = new FileWriter("C:\\Users\\فاطمة\\Downloads\\accounts.txt", true);
x = new Formatter(f);
x.format("%s %s%n",user.toUpperCase(),pass);
System.out.println("You registered succesfully");
x.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
catch(Exception e){}
}
else
System.out.println("Password and confirm password are not matching");
}
答案 0 :(得分:2)
因此,不要使用Scanner打开和读取文件,而是分别尝试使用BufferedReader和Writer进行读写。在下面的代码中,我们正在读取文件,如果名称存在,它将把你的布尔值更改为true,然后抛出你的错误,否则它将完成注册。它还将编写新信息。现在,您可能想要添加的一件事是,如果信息无效,则循环回到顶部。
另外作为一个方面,为了更好的跨操作系统功能,你应该使用File.separator(),它将做同样的事情。
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("Registration Page");
System.out.println("NOTE: your username is a unique one so it cannot be changed.");
System.out.printf("Username: ");
String user = input.next();
System.out.printf("Password: ");
String pass = input.next();
System.out.printf("Confirm Password: ");
String conf = input.next();
int length = pass.length();
int passInt = Integer.parseInt(pass);
int confInt = Integer.parseInt(conf);
File file = new File("C:"+File.separator + "Users"+File.separator + "فاطمة"+File.separator + "Downloads"+File.separator + "accounts.txt");
if (length < 6) {
System.out.println("Too short password, password must be 6 characters or more");
} else {
if (passInt == confInt) {
try {
BufferedReader br = new BufferedReader(new FileReader(file));
String current;
boolean checkname = false;
while ((current = br.readLine()) != null) {
if(current.equalsIgnoreCase(user)){
checkname = true;
}
}
if (checkname) {
System.out.println("Username is already exists and used, please type another one");
} else {
Formatter x = null;
try {
FileWriter f = new FileWriter(file.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(f);
bw.write(user);
bw.close();
x = new Formatter(f);
x.format("%s %s%n", user.toUpperCase(), pass);
System.out.println("You registered succesfully");
x.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
catch (Exception e) {
}
} else {
System.out.println("Password and confirm password are not matching");
}
}
}
}
答案 1 :(得分:0)
我发现我的代码有什么问题:
问题是用户名是以这种格式在文本文件中找到的:
JOHN 114477
SARAH 887755
用户名是大写字母,当我输入新用户名时,它用小写字母书写,所以当在文本文件中搜索用户名时,程序会将小写字母的名称与大写字母的名称进行比较。匹配,因此它允许我输入之前存在的相同用户名。
正确的解决方案是编辑此行并添加toUpperCase();就像这样:
String user = input.next().toUpperCase();