Java如何读取特定行

时间:2011-12-17 11:05:51

标签: java login bufferedreader bufferedwriter

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

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

我有它,所以当它创建文件时,它会保存密码两次,一次是“playerPass”,一次是“currPass”,这样,如果计划更改密码(我将使用登录脚本) ),然后使用playerPass变量将currPass读作正确的密码。无论如何,我希望它使用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]

1 个答案:

答案 0 :(得分: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]")),并在测试if (token.equals("character-password"))时将其作为else语句添加....

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

HTH