Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过file/FileWriter/Scanner类检查文本文件中是否存在用户名_Java_File_Filewriter - Fatal编程技术网

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),则会通知用户并给予用户输入有效密码的机会
  • 以确保用户实际输入用户名或密码
这些当然与文件写入无关,但确实增强了用户的选项,以确保确实存在要写入文件的内容

要读取accounts.txt文件,使用Scanner.hasNextLine()方法代替Scanner.hasNext()方法,原因如下:

Scanner.hasNext()方法用于Scanner.next()方法,Scanner.hasNextLine()方法用于Scanner.nextLine()方法

Scanner.next()方法使用任何用作令牌分隔符的分隔符。默认情况下,Scanner使用空格作为标记分隔符,因此,如果读取用户名(用户名的名字和姓氏可以用空格分隔),这将提供2个标记(名字和姓氏),这意味着您需要对Scanner.next()方法进行2次调用以获取完整的用户名(每个单词一个)。考虑一下,如果文件中有一个空行或文件中用户名前面有一个空格,现在需要做什么

但是Scanner.nextLine()方法读取完整的文件行文本,因此它可以在一次调用中从文件中读取用户名。您还将注意到,我还将String.trim()方法应用于Scanner的末尾。nextLine()方法:

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)有帮助,而且对该网站的所有未来访问者都有帮助。你的答案只不过是一个代码转储答案,所以无论如何。。。。。。我能问一下我所做的和你所做的有什么区别吗?我只是想知道,当涉及到文件编写之类的问题时,供将来参考