-1

我想要帮助自己,我制作了一个可以创建用户文件的文件,因为我打算制作一个游戏。它有一个登录名,其中包含登录名、显示名和密码。它将其写入以登录名命名的文件。

现在我也希望使用 java 制作一个登录脚本。我想知道,具体来说,如何读取该行和已经输入的密码。

我有它,这样当它创建文件时,它会保存密码两次,一次作为“playerPass”,一次作为“currPass”,这样,如果有人计划更改密码(我将从登录脚本中使用),那么currPass 将被读取为使用 playerPass 变量的正确密码。无论如何,我希望它使用 BufferedReader 和 FileReader 读取指示密码和当前密码的行,以便可以登录。

有人可以帮我解决这个问题吗?在某种程度上,我仍然是新手。

PS。我可以调整代码,我只需要稍微解释一下如何编写代码即可,哈哈。

变量:

playerLogName
playerName
playerPass
currPass

文件名:

Login.java
CharacterFileCreator.java

做了一个补充,让它工作了一半,但是在我输入密码后它会锁定(使用 Dr. Java),不管我做什么,不正确或正确,并且 System.out.println() 永远不会执行,即使密码是不正确的。核实:

import java.util.Scanner;
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.FileNotFoundException;

class Login {

  public static void LogIn(){
    boolean loggedIn = false;
    loggedIn = true;
    System.out.println("You are now logged in!");
  }

  public static void main(String[] args) {  
    System.out.println("What is your login name?");
    Scanner charLogName = new Scanner(System.in);
    String playerLogName = charLogName.nextLine();
    boolean charFileFound = false;
    BufferedReader characterfile = null;

    try {
      characterfile = new BufferedReader(new FileReader("./game/characters/" + playerLogName + ".txt"));
      charFileFound = true;
    }
    catch (FileNotFoundException fileex1) {}
    if(charFileFound == false){
      System.out.println("Login name does not exist!");
    }
    else
    {
      System.out.println(playerLogName + ": is your username, what is your password?");
      Scanner charPassword = new Scanner(System.in);
      String playerPass = charPassword.nextLine();
      String line = "";
      String token = "";
      String token2 = "";
      int ReadMode = 0;
      try {
        line = characterfile.readLine();
      } catch (IOException ioexception) {
        System.out.println(playerLogName + ": error loading file.");
      }
      while (line != null) {
        line = line.trim();
        int spot = line.indexOf("=");
        if (spot > -1) {
          token = line.substring(0, spot);
          token = token.trim();
          token2 = line.substring(spot + 1);
          token2 = token2.trim();
          switch (ReadMode) {
            case 1:
              if (token.equals("character-password")) {
              if (playerPass.equals(token2)) {
                LogIn();
              } else {
                System.out.println("You entered an incorrect password!");
              }
              break;
            }
          }
        }            else {
          if(line.equals("[ACCOUNT]")) {
            ReadMode = 1;
          }
          else if(line.equals("[EOF]")) {
            try {
              characterfile.close();
            } catch (IOException ioexception) {
            }
          }
        }
      }
    }
  }
}

编辑:

样本文件:

[ACCOUNT]
character-loginname = SampleFile
character-password = samplepassword
[EOF]
4

1 回答 1

0

使用属性文件可能会更容易!你仍然可以给它任何你想要的文件扩展名,如果你愿意的话甚至可以加密它,但是通过使用 Properties 对象,你可以获取或设置任何属性,而不管行号如何!

在这里看一个例子:http ://www.exampledepot.com/egs/java.util/Props.html

更新:我发现了您的问题-您永远不会在 while循环中读取文件的下一行,因此您可能会发现,如果您将System.out.println(line);其放在循环内的某个位置,它只会继续显示“ [ACCOUNT]”-第一行你的文件!

为了解决这个问题,我可能倾向于将整个循环放在一个try catch语句中,并将条件更改为while((line = characterfile.readLine()) != null). 这样,每个循环都使用下一行,但在捕获异常方面可能会出现问题,具体取决于具体情况。

或者,您可以在语句中line = characterfile.readLine();设置ReadMode为 1之后添加if(line.equals("[ACCOUNT]")),并在测试时作为 else 语句添加if (token.equals("character-password"))....

但是,如果您确实遵循我的建议并使用该Properties文件,则不需要执行任何循环来获取字符数据,因为您可以调用类似password = propertyObject.getyProperty("password")示例链接所示的内容。

高温高压

于 2011-12-17T11:15:26.483 回答