【问题标题】:Java How To Read A Specific LineJava 如何读取特定行
【发布时间】:2011-12-17 11:05:51
【问题描述】:

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

现在我也想用 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]

【问题讨论】:

  • 在您的问题中显示示例文件。
  • “对不起,这里是凌晨 4:15,哈哈。” 这不是一个正当的借口。如果你不得不为一个糟糕的问题找借口,这是一个很好的迹象,表明你不应该问这个问题,或者应该推迟问这个问题,直到你适合这样做。 -1
  • 我 17 岁,我还是个孩子,我有一个很好的“借口”,而那个“借口”是为了我的“脑屁”!没有别的,我是新手,我需要帮助,问问题的目的是寻求帮助,如果你不知道什么,你不知道,我一直在寻找修复,好吧,一些几个小时,但我不会坐 12 个小时来寻找如何解决这样的问题。 ** 是的,连续 34 小时起床是一个正当的借口,非常感谢。
  • @Mauricio,我相信我展示的信息已经足够了 >.>,我相信大多数人都会同意我的观点。
  • @Daniel 老实说,我比你年轻,我也不认为这是一个好的借口。我也只用 Java 编程了大约 6 个月。连续 34 小时起床也可能是一个促成因素 - 你和任何人一样,显然无法思考,因此,你可能会忽略/错过程序中的一个简单错误,并在你没有的时候提出问题专注。在“brainfart”之前,您肯定会想到“pass”之类的东西吗?争论也不好,安德鲁和毛里西奥正在提出有效的观点并试图在你聪明的同时提供帮助!

标签: java login bufferedreader bufferedwriter


【解决方案1】:

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

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

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

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

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

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

HTH

【讨论】:

  • 安迪,我会检查一下,但在我这样做之前我仍然希望解决我当前的问题,否则,我不会从我已经犯过的错误中吸取教训,我只是学习新事物以避免错误。前段时间我在一个非盈利、非托管的 RuneScape 私人服务器上进行了实验,只是为了一点编码经验,无论如何,谢谢你的帮助。
  • 很遗憾,您提供的信息无法帮助您解决当前问题。您的代码对我来说看起来不错,但我确实想知道您所说的“锁定”是什么意思,因为在检查密码后您的代码似乎没有做太多 - 如果您输入错误的密码,System.out.println() 行是否会执行,或者您是否在任何地方收到任何异常/错误?
  • 不,它之后什么都没有,它只是冻结了,我一直在等待,但什么也没发生,我只需要重新编译它,这样它就不会再试图做任何导致它锁定的事情。跨度>
  • 另外,我进行了编辑,而不是仅仅从 boolean loggedIn 切换 false - true,我让它避免切换它并显示系统消息,但是,对于不正确/正确的密码仍然无济于事.
  • 请看我的编辑。我想我已经解决了你的问题......我不想这么说,但是当你累了并且无法进行简单的调试时,这是你错过的简单问题!......
猜你喜欢
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多