我自己想要帮助,我制作了一个可以创建用户文件的文件,因为我打算制作游戏。它有一个登录名,用于写入登录名,显示名和密码。它将其写入以登录名命名的文件。
现在我也希望使用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]
答案 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