-1

したがって、RegisterandLogin というプログラムを作成しています。このプログラムは、基本的に、新しいアカウントを作成するためにユーザー名、パスワードを入力し、パスワードを再入力する必要があります。ユーザーとパスワードの検証は、次を使用して実行できます。

1.登録時に入力したユーザー名は、username.txt の 5 つの名前のいずれとも同じであってはなりません。

2.また、ユーザー名は数字を含まない 5 ~ 8 文字である必要があります (つまり、ユーザー名は [AZ] または [az] のみで、[0-9] のような数字は使用できません)。

3. パスワードも 5 ~ 8 文字で、数字も使用できます (したがって、12345 と abcde はどちらも有効なパスワードです)。

4.再入力するパスワードは、パスワードと同じである必要があります。そうでない場合、登録ボタンを押した後にエラー メッセージが出力されます。

ユーザー名が 5 ~ 8 文字の有効性チェックに合格し、ユーザー名が username.txt に存在せず、パスワードが有効性チェックに合格すると、新しいユーザー名が username.txt に追加されます。

そのため、すでに 5 つの名前で username.txt を作成しています。ただし、私が抱えている問題は、ユーザー名が使用されているかどうかを確認できるように、username.txt ファイルを読み取る方法がわからないことです。

ここのコードは少し長いですが、助けていただければ幸いです。

import javax.swing.*;
import java.io.*;
import java.awt.event.*;
import java.awt.*;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.*;
import java.util.Scanner;

public class RegisterandLogin extends JFrame  {


// variables for Sign up screen
private JPanel suP; 
private JLabel suName, suPW, suRetypePW;
private JTextField suNameText, suPWText, suRetypePWText;
private JButton suButton; 
public RegisterandLogin ()
    { 
    super ("Register and Login");
    signupScreen();

}

public void signupScreen () {
    suP = new JPanel ();
    // suP.setSize(50, 60);
    setLayout (new FlowLayout());
    setContentPane (suP);
    suName = new JLabel ("Name");
    suNameText = new JTextField (10);
    suPW = new JLabel ("Password");
    suPWText = new JTextField (10);
    suRetypePW = new JLabel ("Retype Password");
    suRetypePWText = new JTextField (10);
    suButton = new JButton ("Register");
    suP.add (suName);
    suP.add(suNameText);
    suP.add(suPW);
    suP.add (suPWText);
    suP.add (suRetypePW);
    suP.add (suRetypePWText);
    suP.add(suButton);
    suP.setVisible(true);
    ButtonHandler handlersu = new ButtonHandler();
    suButton.addActionListener(handlersu);
}

public void validatebyarray() {

    String[] read1=null;
            String[] read=null;
    read1=files(read);

    int minL = 5, maxL = 8;
    String stName = suNameText.getText();//username
    String stPW = suPWText.getText();//password
    String stRePW = suRetypePWText.getText();//retype password


    /******************************************************
     *  Validate user name                                   *
     ******************************************************/

    if(stName.length()< minL || stName.length() > maxL )  // Check username length
        System.out.println ("User name must be between 5 and 8");
    else 
    {
            //check invalid characters in username
        for (int i = 0 ; i < stName.length(); i ++)  // Check for invalid character
            if (!
               ((stName.charAt (i)>= 'A' && stName.charAt (i) <= 'Z') ||
               (stName.charAt (i)>= 'a' && stName.charAt (i) <= 'z')))
            {
                    System.out.println ("Username contains invalid character"); 
                    break;
            }

        // Match the names in the array (file or database)
        // Note the logic below works but is NOT secure since it discloses
        // information about user names.
        boolean uNfound = false;
        for (int j = 0; j < 4; j++)
            if (read1[j].equals(stName))
            {
                System.out.println ("User name " + read1[j] + " already exits");
                uNfound = true;
                break;
            }
        //if    (!uNfound)
        //  System.out.println ("User name " + stName + "  created");                       
    }
    System.out.println ("After UN");
    /******************************************************
     *  Validate password                                *
     ******************************************************/


    if(stPW.length()< minL || stPW.length() > maxL )  // Check username length
        System.out.println ("Password must be between 5 and 8");
    else 
    {
            //check invalid characters in username
        for (int i = 0 ; i < stPW.length(); i ++)  // Check for invalid character
            if (!
               ((stPW.charAt (i)>= '0' && stPW.charAt (i) <= '9') ||
                       (stPW.charAt (i)>= 'A' && stPW.charAt (i) <= 'Z') ||
                       (stPW.charAt (i)>= 'a' && stPW.charAt (i) <= 'z')))
            {
                    System.out.println ("Password contains invalid character"); 
                    break;
            }

        // Note stName replaced by stPW and stRePW;
        // uN[] replaced by pN[]
        boolean uNfound = false;

            if (stPW.equals(stRePW))
            {
                System.out.println ("User name " + stName + "  created");
                uNfound = true;

            }
        if  (!uNfound)
            System.out.println ("Passwords does not match");







}
    //System.out.println ("After UN again");
}





class ButtonHandler implements ActionListener
{
    public void actionPerformed (ActionEvent event){

        if (event.getSource () == suButton){
            System.out.println ("SU button in register screen hit");

            validatebyarray();
        }
    }
}

public String[] files(String [] read) 
{
    try {



        BufferedReader file1 = new BufferedReader(new FileReader("usernames.txt"));                   
        //  Scanner fileReaderScan=new Scanner(readTextFile);

            //only want first 5 lines
            for(int count=0;count<5;count++)
            {
               read[count] = file1.readLine();  //use readLine method
           System.out.println(read[count]);
            }

       file1.close();   //close file

    }


    catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        System.out.println("OOps");
    }
    return read;
}
public static void main(String[] args) {
    // TODO Auto-generated method stub
RegisterandLogin rl = new RegisterandLogin ();
rl.setSize(200, 300);
rl.setVisible(true);
rl.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

}
4

2 に答える 2

1

read メソッドで以下のようなことができます

public String[] files() 
    throws FileNotFoundException
{
   List<String> existingUsers = new ArrayList<String>();
   File users = new File("username.txt");
   Scanner sc = new Scanner(users);
   while (sc.hasNext()) {
       existingUsers.add(sc.nextLine());
   }
   return existingUsers.toArray(new String[existingUsers.size()]);
 }
于 2013-08-10T04:38:05.383 に答える
0

おそらく、試したように BufferedReader を使用するだけでこれを行うことができますが、作成したコードでは、読み取る行数をハードコーディングしましたが、ファイルに行を追加することについて質問があります。

おそらく何らかの方法でパスワードもチェックすることになるので、ファイルにパスワードも含めたいと思うでしょう(これは宿題です。実際にはパスワードを保存することはありません)。有効な文字に関して課さなければならない制限を考えると、ファイルの行ごとにユーザー名とパスワードを保存できるように、セパレーターを簡単に選択できるでしょう。

あなたの使用パターンは、存在を効率的にチェックする必要があるということであるため、パスワードも必要とするよりも、ユーザー名に使用するより良いデータ構造がセットになるため、ユーザー名からパスワードへのマップは良い選択です.

リソース (ファイルなど) を使用する場合は、finally ブロックを使用してリソースを閉じることをお勧めします。

だから、あなたは次のようなものになってしまうでしょう...

Map<String,String> loadUsersAndPasswords() {
    Map<String,String> usernameToPassword = new HashMap<String,String>();
    FileReader fr = new FileReader("usernames.txt");
    try {
        BufferedReader br = new BufferedReader(fr);
        for (String line = br.readLine(); line != null; line = br.readLine()) {
            int splitLocation = line.indexOf(":");
            String username = line.substring(0, splitLocation);
            String password = line.substring(splitLocation + 1);
            usernameToPassword.put(username, password);
        }
    } finally {
        fr.close();
    }

    return usernameToPassword;
}
于 2013-08-10T06:08:28.040 に答える