Java不会附加到.DAT文件

时间:2014-07-31 23:51:54

标签: java file-io

我正在编写一个基本程序,它有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

4 个答案:

答案 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。