0

这是一个锻炼程序,它会询问用户的姓名并创建一个文件来存储他的所有数据。在该文件中,有 3 个文字:全名、年龄和经验。

当用户输入他的用户名时,不起作用的功能是打印出文件中的所有信息。

因此,如果我有一个名为 Bob 的帐户,并且我在控制台中输入 Bob,我应该得到我的全名、我的年龄和我的经验。(之前已经存储在文件中)。

这是我从文件中读取数据并打印出来的方法。我用调试器运行了几次,但它只读取文件的标题,而不是其中的信息。结果是“找不到文件”。我该如何解决?谢谢。

 public void getInfo(String nameIn) {
    Scanner keyboard = new Scanner(System.in);
    Scanner x;
    out.println("\nWhat's your account's name?");
    nameIn = keyboard.nextLine();

    //It reads the title of the file, not the data inside it.
    try {
        x = new Scanner(nameIn);
        if (x.hasNext()) {
            String a = x.next();
            String b = x.next();
            String c = x.next();
            out.println("Account data for user: " + nameIn);
            out.printf("Name: %s \tAge: %s \tExperience: %s", a, b, c);
        }
    } catch (Exception e) {
        out.println("Could not find file.");
    }

这是该类中的其余代码。

public class createMember {

public String name;
private String fullName;
private String age;
private String experience;

private Formatter x;

public createMember(String name) {
    this.name = name;
}

public void setMembership() {
    try {
        x = new Formatter(name);
        out.println("File with name \"" + name + "\" has been created!");
    } catch (Exception e) {
        out.println("Could not create username.");
    }
}

public void setInfo() {
    Scanner keyboard = new Scanner(System.in);

    out.println("Enter your Full Name");
    fullName = keyboard.nextLine();
    out.println("Enter your Age");
    age = keyboard.nextLine();
    out.println("Enter your lifting experience");
    experience = keyboard.nextLine();
    x.format("Name: %s \tAge: %s \tExperience: %s", fullName, age, experience);
}
4

3 回答 3

1
public void getInfo(String nameIn) {
    Scanner keyboard = new Scanner(System.in);
    Scanner x;
    System.out.println("\nWhat's your account's name?");
    nameIn = keyboard.nextLine();

//It reads the title of the file, not the data inside it.
try {
    File file = new File("nameOfYourFile.txt");
    x = new Scanner(file);
    while (x.hasNextLine())) {
        String line = x.nextLine();

        if (line.contains(nameIn)){  // or you can use startsWith() 
                                    // depending how your text is formatted
            String[] tokens = line.split(" ");
            String a = tokens[0].trim();
            String b = tokens[1].trim();
            String c = tokens[2].trim();
            System.out.println("Account data for user: " + nameIn);
            System.out.printf("Name: %s \tAge: %s \tExperience: %s", a, b, c);

        }
    }
} catch (FileNotFoundException e) {
    System.out.println("Could not find file.");
}
于 2013-11-06T13:28:27.867 回答
0

您必须将 an 传递InputStream给您的扫描仪,而不是文件的名称。

 final String pathToFile = "/my/dir/" + nameIn;
 x = new Scanner(new FileInputStream(new File(pathToFile)));

尽管我必须说我从未见过这种逐行读取文件的方法。我通常使用BufferedLineReader.

于 2013-11-06T13:22:23.223 回答
0

检查hasNext()一次并调用next()三次不是一个好的设计。如果没有更多可用的令牌,第一次之后的任何next()调用都可能失败。

x.next()因此,一种可能性是在第一次通话后您的代币已用完。

另一种可能性是给定的路径名nameIn​​与文件系统上的任何文件都不对应。

此外,您应该使用更具体的类型而不是Exception. 如果你这样做了,你就会知道哪个new Scanner(file)x.next()抛出了异常。

于 2013-11-06T13:25:15.730 回答