Java 如何通过file/FileWriter/Scanner类检查文本文件中是否存在用户名
我不确定我做错了什么,因为在我的主课上运行程序后,它完全跳过了整个过程Java 如何通过file/FileWriter/Scanner类检查文本文件中是否存在用户名,java,file,filewriter,Java,File,Filewriter,我不确定我做错了什么,因为在我的主课上运行程序后,它完全跳过了整个过程 while(usernameCheck.hasNext()){ //code... } 循环,即使我故意在我的“accounts.txt”文件中添加了一个用户名。我还尝试了contains()方法,但很明显,如果我在accounts.txt文件中输入“John1”和“John”,它将不会接受 import java.util.Scanner; import java.io.*; public class Crea
while(usernameCheck.hasNext()){
//code...
}
循环,即使我故意在我的“accounts.txt”文件中添加了一个用户名。我还尝试了contains()
方法,但很明显,如果我在accounts.txt文件中输入“John1”和“John”,它将不会接受
import java.util.Scanner;
import java.io.*;
public class CreateAccount {
public static void newAccount() throws IOException{
Scanner keyboard = new Scanner(System.in);
FileWriter fw = new FileWriter("accounts.txt",true);
PrintWriter pw = new PrintWriter(fw);
System.out.println("Please enter a username: ");
String user = keyboard.nextLine();
File file = new File("accounts.txt");
Scanner usernameCheck = new Scanner(file);
while(usernameCheck.hasNext()){
String existingUsername = usernameCheck.nextLine();
if(user.equalsIgnoreCase(existingUsername)){
System.out.println("Username already exists");
System.out.println("Please enter a username: ");
user = keyboard.nextLine();
}
}
System.out.println("Please enter a password: ");
String pass = keyboard.nextLine();
System.out.println("Account created!");
***在阅读了我的代码之后,我意识到我还有另一个问题:即使我创建了一个在我的“accounts.txt”类中不存在的用户名,它也会不断重复提示:由于hasNext()方法,用户名已经存在。对此我能做些什么?我把它扔进去测试了一下。它为我找到了一个名字。我猜你的文件路径不是真的
File file = new File("accounts.txt");
首先查找此文本文件的完整路径。输入完整路径,然后查看如何使路径更具相对性
我希望这会有所帮助。下面显示的代码与您的代码之间的差异非常明显。给用户的提示包含在循环块中,原因至少有两个:
- 如果用户输入的用户名已包含在accounts.txt文件中,则可以通知用户该用户名,并给予用户输入其他用户名的机会。这同样适用于密码提示。如果提供了无效的密码(如nothing),则会通知用户并给予用户输入有效密码的机会
- 以确保用户实际输入用户名或密码
String existingUsername=usernameCheck.nextLine().trim()代码>
这样做是为了删除文件行中的任何前导或尾随制表符或空格(如果有)。我们可以这样做,因为Scanner.nextLine()方法返回一个字符串。哦…使用Scanner.hasNext()方法可能是跳过循环的原因
代码中还设置了一种机制,允许用户在“输入用户名”提示下退出newAccount()方法。如果在该提示符下提供了字母q,则退出该方法并返回语句
如前所述,密码提示也被放置在while循环中,以便进行排序验证。目前,只需检查密码是否确实包含某些内容,但这可以扩展到您喜欢的任何密码类型验证。可能是特定长度的密码,包含特定的字符类型等
代码如下:
public static void newAccount() throws IOException {
Scanner keyboard = new Scanner(System.in);
File file = new File("accounts.txt");
FileWriter fw = new FileWriter(file, true);
Scanner usernameCheck = new Scanner(file);
String user = "";
while (user.equals("")) {
System.out.println("Please enter a User name (q to exit): ");
user = keyboard.nextLine().trim();
if (user.toLowerCase().equals("q")) {
System.out.println("User Exit!");
return; // exit the method.
}
while (usernameCheck.hasNextLine()) {
String existingUsername = usernameCheck.nextLine().trim();
if (user.equalsIgnoreCase(existingUsername)) {
System.err.println("Username already exists! Try Again.\n");
user = "";
break;
}
}
}
usernameCheck.close(); // Close the Scanner file object
String pass = "";
while (pass.equals("")) {
System.out.println("Please enter a password for " + user + ": ");
pass = keyboard.nextLine();
if (pass.equals("")) {
System.err.println("Invalid Password! Try Again.\n");
}
}
fw.write(user + System.lineSeparator());
fw.write(pass + System.lineSeparator());
fw.close(); // close the FileWriter object.
System.out.println("Account created!");
}
您使用什么IDE编写代码?它有调试器吗?如果是这样的话,请仔细检查代码,看看它在做什么。@Ken White我正在使用Eclipse它有一个调试器,对吗?您是否考虑过在同一文件上同时打开文件编写器
和扫描仪
可能会导致哪些问题?您的文件中是否有多余的空间,或者每个用户名都会一直排到最后?@DawoodibnKareem我没有;每个用户名都会出现在行的末尾。我现在知道我的问题是什么了,代码正在我的src文件夹和我的包文件夹中创建“accounts.txt”文件。你知道这可能是什么原因吗?关于你在之前的回答中的评论:我还能做什么?这个问题显然质量很低,你的回答没有提供任何解释,只是一个代码转储。有时候,我会看到一些糟糕问题的答案,我也会投赞成票,但这些答案主要是对原始海报的问题以及如何解决这些问题提供一个很好的解释,从一般意义上讲,这样的答案不仅对原始海报(OP)有帮助,而且对该网站的所有未来访问者都有帮助。你的答案只不过是一个代码转储答案,所以无论如何。。。。。。我能问一下我所做的和你所做的有什么区别吗?我只是想知道,当涉及到文件编写之类的问题时,供将来参考