2017-12-08 5 views
0

したがって、ArrayListのArrayListを本質的にシリアライズしていますが、問題が発生しています。正直言って、私はJavaにまだまだ新しく、このサイトで絶えず検索されているだけでなく、これを修正するために非常に多くの方法を試しましたが、成功していません。私は、私の言葉のやり方が難しいかもしれないし、紛らわしいかもしれないことを知っているので、私はここに私のコードを掲載するでしょう。すべてのコードを事前に申し訳ありません。 SuperUserにはLoginInfoのarraylistがあり、PasswordKeeperにはArraylist of SuperUsersがあり、SuperUser arraylistにはPasswordKeeperでシリアル化されています。 LoginInfo arraylistに加えられた変更は保存されず、理由を特定できません。もし誰でも助けてもらえれば、本当にありがたく思っています。ありがとう問題他のArrayListオブジェクトを含むArrayListオブジェクトのシリアライズ

public class PasswordKeeper{ 

    private ArrayList<SuperUser> users; 
    private static Scanner keyboard = new Scanner(System.in); 

    public PasswordKeeper() { 
     users = new ArrayList(); 
    } 

    public void login() { 
     try { 
      // reads in SuperUser arraylist 
      get(); 
     } catch (EOFException a) { 
      System.out.println("You are the First User!"); 
     } catch (IOException b) { 
      System.out.println(b); 
     } catch (ClassNotFoundException c) { 
      System.out.println(c); 
     } 
     boolean loopDisplay = true; 
     while (loopDisplay) { 
       existingUser = keyboard.next(); 
       existingPass = keyboard.next(); 
       SuperUser temp = new SuperUser(existingUser, existingPass); 
       System.out.println(); 
       if (users.contains(temp)) { 

        // viewing superUser method 
        temp.display(); 
        //saves after method call is over 
        try { 
         System.out.println("Saving."); 
         save(users); 
        } catch (IOException e) { 
         System.out.println(e); 
        } 
       } 
      } 
      //This happens if there is a new user 
      if(answer == 2){ 
      SuperUser tempNew = null; 
      boolean cont = true; 
      String newUser; 
      String pass; 
      while(cont){ 
       newUser = keyboard.nextLine(); 
       System.out.println(); 
       //System.out.println(users.size()); 

       tempNew = new SuperUser(newUser, pass); 
       if(passValid(pass) == true){ 
        if(makeSure(tempNew) == true){ 
         System.out.println("Login Created!"); 
         tempNew = new SuperUser(newUser, pass); 
         //actually being added to the arraylist 
         users.add(tempNew); 
         cont = false; 
        } 
       } 
      } 
      //SuperUser.display method 
      tempNew.display(); 
      try{ 
       System.out.println("Saving."); 
       save(users);  
      }catch(IOException e){ 
       System.out.println(e); 
      } 
     } 
     } 
    } 
    //makeSure and passValid methods 
    public boolean makeSure(SuperUser user){ 
    if(users.contains(user)){ 
     return false; 
    } 
    return true;  
} 

public boolean passValid(String pass){ 
     boolean passes = false; 
     String upper = "(.*[A-Z].*)"; 
     String lower = "(.*[a-z].*)"; 
     String numbers = "(.*[0-9].*)"; 
     String special = "(.*[,~,!,@,#,$,%,^,&,*,(,),-,_,=,+,[,{,],},|,;,:,<,>,/,?].*$)"; 

     if((pass.length()>15) || (pass.length() < 8)){ 
      System.out.println("Entry must contain over 8 characters\n" + 
      "and less than 15."); 
      passes = false; 
     }if(!pass.matches(upper) || !pass.matches(lower)){ 
      System.out.println("Entry must contain at least one uppercase and lowercase"); 
      passes = false; 
     }if(!pass.matches(numbers)){ 
        System.out.println("Password should contain atleast one number."); 
        passes = false; 
     }if(!pass.matches(special)){ 
        System.out.println("Password should contain atleast one special character"); 
        passes = false; 
     }else{ 
      passes = true; 
     } 
     return passes; 
    //serializable methods 
    public void save(ArrayList<SuperUser> obj) throws IOException { 

     File file = new File("userInformation.dat"); 
     FileOutputStream fileOut = new FileOutputStream(file, false); 
     BufferedOutputStream buffedOutput = new BufferedOutputStream(fileOut); 
     ObjectOutputStream out = new ObjectOutputStream(buffedOutput); 
     out.writeObject(obj); 
     out.close(); 
     fileOut.close(); 
    } 

    public ArrayList<SuperUser> get() throws IOException, ClassNotFoundException { 
     FileInputStream fileIn = new FileInputStream("userInformation.dat"); 
     BufferedInputStream buffedInput = new BufferedInputStream(fileIn); 
     ObjectInputStream in = new ObjectInputStream(buffedInput); 
     users = (ArrayList<SuperUser>) in.readObject(); 
     in.close(); 
     fileIn.close(); 
     return users; 
    } 

    public class SuperUser implements Serializable { 
     private String userName; 
     private String password; 
     private static Scanner keyboard = new Scanner(System.in); 
     private ArrayList<LoginInfo> info = new ArrayList(); 

     public SuperUser(String name, String pass) { 
      userName = name; 
      password = pass; 
     } 

     public String getUser() { 
      return userName; 
     } 

     public void display() { 

      String next = keyboard.next(); 
      //want to add data to LoginInfo arraylist 
      if (next.equalsIgnoreCase("add")) { 
       add(); 
      } else if (next.equalsIgnoreCase("delete")) { 
       delete(); 
      } else if (numberCheck(next)) { 
       int choice = (int) Integer.parseInt(next) - 1; 
       edit(choice); 
      //!!!! this: after doing this i lose whatever data i added 
      //to the LoginInfo arraylist, right after this the 
      //SuperUser arraylist gets saved. but the added data to 
      //loginInfo does not 
      } else if (next.equalsIgnoreCase("logout")) { 
       System.out.println(info.size()); 
      } 
     } 

     public boolean numberCheck(String in) { 
      try { 
       Integer.parseInt(in); 
      } catch (NumberFormatException e) { 
       return false; 
      } 
      return true; 
     } 
     //method to add to the Arraylist 
     public void add() { 
      System.out.println("What is the website name?:"); 
      String trash = keyboard.nextLine(); 
      String webName = keyboard.nextLine(); 
      System.out.println("The Username?:"); 
      String webUsername = keyboard.nextLine(); 
      System.out.println("The Password?:"); 
      String webPass = keyboard.nextLine(); 
      info.add(new LoginInfo(webUsername, webPass, webName)); 
      System.out.println(info.size()); 
      //method goes back to display 
      display(); 
     } 
    } 
} 
+0

'LoginInfo Serializable'はありますか? 'Scanner keyboard'を' SuperUser'クラスの外に置こうとしましたか? – Stefan

+0

このコードを問題を説明する数行に減らすことはできますか?あなたは20行未満の例を書くことができるはずです。 'LoginInfo arraylistに加えられた変更は保存されません'これを行った後でsaveをどこで呼び出していますか?ログインに成功した後は 'save'にしか表示されません。 –

+0

はい、クラスはシリアライズ可能です。私はすでにたくさんのことを取った、私はあまりにも多くを取るしたくない。 ScannerはPasswordKeeperクラスとLoginInfoクラスの両方にあります。私はそれが何かを変更するだろうと信じていません..ユーザーが 'ログアウト'を入力した後、またはスーパーユーザークラスを終了した後、私はパスワードキーパー内の保存メソッドを呼び出す、私はさらにコードを編集しようとする私の問題 – okashii

答えて

0

あなたの問題は、あなたがどのユーザ名とパスワードを使用して一時オブジェクトを作成し、ここで

SuperUser temp = new SuperUser(existingUser, existingPass); 
    System.out.println(); 
    if (users.contains(temp)) { 
     // viewing superUser method 
     temp.display(); 

です。

あなたの 'users.contains()'メソッドは、 '.equals()'がユーザー名に基づいているためtrueを返しますが、 'temp'オブジェクトはリストのインスタンスとは異なります。

したがって、 'temp.display()'を呼び出すと、リスト内のオブジェクトを呼び出さないため、データを変更しても保存されません。

そのユーザーのリストから既存のオブジェクトを見つける必要があります。私はあなたのリストをスワップして、ユーザー名をキーにしたマップにすることをお勧めします。

+0

ありがとうございます。 – okashii

0

リストはusersです。新しいSuperUserインスタンス(temp)を作成すると、このリストに属していることを確認しています(users.contains(temp)、ここではどこから発生するのでしょうか?)それが所属していた場合は、displayというメソッドが呼び出され、がそのSuperUseradd()コール)に追加されますが、実際には発生しません。

また、users(新しいSuperUserインスタンスがそこに属しているかどうかを確認します)を参照してください、私はあなたがそれを上書きするところを見ていますが、インスタンスを追加することはありませんそれは常に空です。

SuperUserには、アレイリストにLoginInfoが含まれていますか?

+0

私に1つの瞬間を与えてください – okashii

+0

新しいユーザーを作成すると、コードが追加され、arraylistが追加され、SuperUser.displayメソッドがLoginInfo arraylistに追加されます。 LoginInfo arraylistにデータが追加されると、再びSuperUser.displayに行きます。その後、logoutと入力すると、PasswordKeeperに戻ります。ログインし、SuperUserのarrayListを保存します。しかし、私はLoginInfoのデータを失う – okashii

+0

'passValid'と' makeSure'の中に何が入っているのか分からないので、何も言わない。 – skapral

関連する問題