我正在编写一个基本程序,它有3个菜单选项:创建用户,登录和退出。然后,用户可以选择其中一个菜单选项。
如果他们选择“创建用户”,系统将提示他们输入用户ID和密码(必须遵循模式),然后检查.DAT文件以确保尚未使用用户ID。成功完成后,程序会将新的用户ID和密码写入.DAT文件的末尾。
如果他们选择登录,系统将提示他们输入用户名,然后输入密码,程序将读取.DAT文件以验证他们是否已记录。
选择退出将显示一条消息,“您已退出。”
我在java编程方面相当新,就像预警一样。
我遇到的代码问题: 选择新用户不会附加到.DAT文件 选择登录 - 程序似乎没有正确检查.DAT文件,因为即使 - 虽然我输入的是现有帐户信息,但仍然会出现“无效用户ID”错误。
import java.io.*;
import java.util.*;
/**
* This program will utilize a menu structure and validate input if the user doesn't choose
* a correct option. Writes a new ID and password to .dat file when user chooses to
* create new user from menu.
*
* @author CMS
* @Date 7/28/2014
*/
public class Passwordv2 {
static boolean answer = true;
static final String MENUANSW = "[1-3]{1}", USERID = "[A-Z,a-z]{6}-[0-9]{2}"; //, PASSWORD = "";
static String iMenuOption="", iID, recPassword, recUserID, password;
static Scanner scanner,scannerDat;
static PrintWriter pw;
public static void main(String[] args) {
init();
while (answer == true) {
menu();
if (iMenuOption.equals("1")) createUser();
else
if (iMenuOption.equals("2")) signIn();
else {answer = false;}
}
closing();
} // end of main
public static void init(){
//User input scanner
scanner = new Scanner(System.in);
//PrintWriter
try {
pw = new PrintWriter(new FileOutputStream (new File ("account.dat"),true) );
}
catch(FileNotFoundException ex) {
}
} // end of INIT
public static String menu(){
do {System.out.println("Please select from the following:");
System.out.println("1. Create a New User");
System.out.println("2. Sign in");
System.out.println("3. Exit");
iMenuOption = scanner.next();
answer = isValMenuOption(iMenuOption);
if (answer == false) { System.out.print("Incorrect Choice. ");}
} while (!answer);
return iMenuOption;
}
public static boolean isValMenuOption(String iMenuOption) {
return(iMenuOption.matches(MENUANSW));
}
public static void createUser() {
boolean validID = true, newID = true;
do {if (!validID) {System.out.println("User ID did not meet requirements.");}
if (!newID) {System.out.println("This User ID has been taken.");}
System.out.println("Please select a User Id (6 letters, followed by a dash (-), followed by 2 numbers).");
iID = scanner.next();
validID = isValidID(iID);
newID = isNewID(iID);}
while (validID==false || newID == false);
boolean valLength = true, valNum = true, valUpper = true, valLower = true;
do{ System.out.println("Please select a Password:");
System.out.println("(6-12 characters, one number, one upper case, one lower case, no white space or symbols).");
password = scanner.next();
valLength = isValLength(password);
valNum = valNum(password);
valUpper = valUpper(password);
valLower = valLower(password);}
while (!valLength || !valNum || !valUpper || !valLower);
pw.println(iID);
pw.println(password);
//menu();
}
public static boolean isValidID(String iID){
return(iID.matches(USERID));
}
public static boolean isNewID(String iID){
answer = true;
// Dat file scanner
try {
scannerDat = new Scanner(new File("account.dat"));
scannerDat.useDelimiter("\r\n");
}
catch (Exception e) {
e.printStackTrace();
System.out.println("File error");
System.exit(1);
}
while (scannerDat.hasNext()) {
recUserID = scannerDat.next();
recPassword = scannerDat.next();
if (recUserID.equals(iID)) {
answer = false;
break;
}
}
return answer;
}
public static boolean isValLength(String password) {
if (password.length() <6 || password.length() > 12) System.out.println("Password did not meet length requirements. ");
return(password.length() >= 6 && password.length() <= 12);
}
public static boolean valNum(String password) {
if (password.matches(".*[0-9].*") == false) System.out.println("Password must contain at least one number. ");
return(password.matches(".*[0-9].*"));
}
public static boolean valUpper(String password){
if (password.matches(".*[A-Z].*") == false) System.out.println("Password must contain one upper case letter.");
return (password.matches(".*[A-Z].*"));
}
public static boolean valLower(String password){
if (password.matches(".*[a-z].*") == false) System.out.println("Password must contain one lower case letter.");
return (password.matches(".*[a-z].*"));
}
public static void signIn() {
boolean newID;
System.out.println("Enter User ID.");
iID = scanner.next();
System.out.println("Enter Password.");
password = scanner.next();
newID = isNewID(iID);
if (newID == false) {
if (password.equals(recPassword)) {System.out.println("Authenticated. You have signed in.");}
else {System.out.println("Invalid Password.");}
}
else {System.out.println("Invalid User ID.");}
}
public static void closing(){
System.out.println("You signed out.");
pw.close();
}
} // end of program
我的.DAT文件只有
为aabbcc-11
Onetwo3
AAABBB-22
Onetwo34
答案 0 :(得分:0)
更改此行:
scannerDat.useDelimiter("\r\n");
到
scannerDat.useDelimiter("\n");
适合我!
答案 1 :(得分:0)
你要做的第一件坏事就是你有一个PrintWriter(pw)和一个Scanner(scannerDat)都访问同一个文件而且他们都没有关闭文件的访问权限,除了最后,pw是闭合。
isNewId是罪魁祸首。在这里你最好使用FileReader而不是Scanner。在方法中本地声明FileReader,并确保在退出之前关闭文件访问,此过程。
同样在isNewId内 - 不要调用System.exit();在这个大小的程序中它没关系,但是任何比它大的东西都是一个主要的罪恶,你不应该像这样不合理地退出一个程序。
答案 2 :(得分:0)
您需要刷新PrintWriter才能立即附加到文件中。否则它只会将其存储在缓冲区中以将其写入文件最终
另外,请检查用户@ simo.3792095对您的代码的评价。您不应该同时打开多个文件流。每次使用它们时打开/关闭流,或者在程序启动时读取整个数据文件,然后使用内存数据,然后在退出时保存。使用内存数据要容易得多,但如果程序崩溃,所有内存中的更改都将丢失。
答案 3 :(得分:0)
感谢所有回复的人。最后,问题最终是我有一个“粗略草稿”java类,然后我将代码复制并粘贴到同一java项目下的新java类中,这似乎给了我一些问题。一旦我创建了一个新的java项目并使用了有效的java类,它就可以了。我还添加了pw.flush();我的代码的方法,所以我能够立即追加到文件而不是关闭。还删除了system.exit。