1

わかりました、何よりもまず、私は Java でのプログラミングに関しては初心者です。私は自分自身を教えているので、私が持っているものでできる限りのことをしているので、ご容赦ください. そうは言っても、ここに私のジレンマがあります!!!

ユーザー名とパスワードのフィールドを格納する「Users.csv」ファイルがあります。

username,password
josh,123456ABC
bman,turtlestew123
etc...

私がやろうとしていることは...

  1. このドキュメント (Users.csv) から行を読み取ります (クラス ファイルと同じディレクトリにあります)。
  2. .split(","); を使用して行を分割します。入力で
  3. 分割 1 を配列 [0] に格納し、分割 2 を同じ配列 [1] に格納します。

ファイルにユーザーを追加すると、アレイが拡張できる必要があります。最終的にはアレイからの情報を確認したいと思いますが、現在の主な関心事は、アレイに情報を取得する方法です。これが私が遊んでいるものですが、私が望むようにする方法がわかりません...

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class BufferedReaderExample {

    public static void main(String[] args) {

        try (BufferedReader br = new BufferedReader(new FileReader("Users.csv")))
        {

            String sCurrentLine;
            String first = "Username is: ";
            String second = "Password is: ";

            while ((sCurrentLine = br.readLine()) != null) {


                String[] information = sCurrentLine.split(",");
                String username = information[0];
                String password = information[1];
                System.out.println(username);
                System.out.println(password);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } 

    }
}

このコードは行を読み取り、それらを分割して画面に出力します...しかし、配列に保存していないため、配列を使用して特定の要素を探すことはできません。

これはログイン GUI 用です。シンプルなユーザー名とパスワードのフィールド。人がログオン ボタンを押すと、ファイルから情報を取得し、ユーザー名を確認してから、パスワードを確認します。繰り返しますが、この部分は全体像ですが、それが何に使用されているかをお知らせしたいだけです.

また、私は非常に経験が浅いことを覚えておいてください。コードを投稿する場合は、似ているが異なるものを使用しないでください。さらに混乱するだけです。

4

4 に答える 4

4

ファイルの各行を再宣言しているため、配列が大きくなっていないと思います(whileループ内にあります)。これを修正するには、ループの前に配列を初期化し、 を使用System.arraycopyして配列を大きくします。

このクイックフィックスの一部として、私の意見では、あなたのアイデアには多くの問題があります。

  • ユーザー名とパスワードは csv ファイルではなく、データベースに保存する必要があります
  • パスワードはハッシュ化する必要があり、アプリケーション自体からクリアで表示されることはありません
  • データベースは塩漬けにする必要があります
  • 配列は、キーと値のペアを表す正しいデータ構造ではありません - そのためには Map を使用する必要があります
  • この場合、メモリ内のすべてのユーザー名/パスワードを取得してユーザー ログインと比較することは合理的ではありません。ユーザーから提供された pwd をハッシュし、データベースでユーザー名を見つけて、2 つのハッシュを比較する必要があります。

ここでは少し単純化していますが、それに関する文献はたくさんあります。

頑張ってください!

于 2013-05-23T16:28:39.007 に答える
1

通常、これには Array に並置された ArrayList を使用します。配列は要素の総数を知る必要がありましたが、arraylist はその下の配列を使用し、必要に応じて動的にサイズ変更します (より大きな配列を作成し、データをコピーします)。

特定のケースでは、実際にはとを取るハッシュマップが必要です。keyvalue

   import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;

public class BufferedReaderExample {

public static void main(String[] args) {



           try (BufferedReader br = new BufferedReader(new FileReader("Users.csv")))
            {

                String sCurrentLine;
                String first = "Username is: ";
                String second = "Password is: ";
                java.util.HashMap<String,String> data = new java.util.HashMap<String,String>();


                while ((sCurrentLine = br.readLine()) != null) {       
                    String[] information = sCurrentLine.split(",");
                    String username = information[0];
                    String password = information[1];
                    System.out.println(username);
                    System.out.println(password);
                    data.put(username,password);
                    }

            } catch (IOException e) {
                e.printStackTrace();
            } 

        }
    }

ログインが来ると data.get(username);、保存されたパスワードを取得し、ユーザーが与えたものと比較するために使用します。

于 2013-05-23T16:24:10.813 に答える
0

自動インクリメント配列が必要な場合は、ArrayListを使用します。これらは、アイテムが追加されると増加する特別なデータ構造です。

User POJO クラスを作成することをお勧めします。明日、CSV の行にもう 1 つのプロパティが追加された場合、以下のクラスにもう 1 つのフィールドを追加することで採用できるためです。

class User {

   private String userName;
   private String password;
   //getter :setters

}

ArrayListファイルの解析中に使用します

List<User> userList = new ArrayList<User>();
try (BufferedReader br = new BufferedReader(new FileReader("Users.csv")))
        {

            String sCurrentLine;
            String first = "Username is: ";
            String second = "Password is: ";

            while ((sCurrentLine = br.readLine()) != null) {


                String[] information = sCurrentLine.split(",");
                String username = information[0];
                String password = information[1];

                User u = new User(); 
                u.setUserName(username);
                u.setPassword(password);
                userList.add(u);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } 
}

また:ユーザーのパスワードを csv ファイルに保存することは、セキュリティ上のリスクです。データベースを使用して、実際のパスワードの代わりに暗号化されたパスワードを保存してみてください(パスワードを復号化して比較するだけで取得できます)

于 2013-05-23T16:25:37.057 に答える
0

try/catch ステートメントの外側で配列を宣言します。

    String[] information;
    try (BufferedReader br = new BufferedReader(new FileReader("Users.csv")))
    {

        String sCurrentLine;
        String first = "Username is: ";
        String second = "Password is: ";

        while ((sCurrentLine = br.readLine()) != null) {


            information = sCurrentLine.split(",");
            String username = information[0];
            String password = information[1];
            System.out.println(username);
            System.out.println(password);
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

その後、他の場所で生成されたデータを使用できるようになります。

于 2013-05-23T16:24:44.970 に答える