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
  • 在这种情况下,获取内存中的所有用户名/密码以将它们与用户登录进行比较是不合理的。您应该对用户提供的密码进行哈希处理,在数据库中找到用户名,然后比较两个哈希值

我在这里简化了一点,关于这方面的文献很多。

祝你好运!

于 2013-05-23T16:28:39.007 回答
1

通常人们使用 ArrayList 来代替 Array。数组需要知道元素的总数,而数组列表使用下面的数组并在必要时动态调整大小(嗯,创建一个更大的数组并复制数据)。

对于特定情况,您实际上需要一个带有 a和 a的哈希图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

在 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 回答
0

如果要自动递增数组,请使用ArrayList。这些是特殊的数据结构,随着项目的添加而增加。

我建议您创建一个User POJO 类,因为明天,如果在 CSV 的行中添加了一个属性,则可以通过在下面的类中再添加一个字段来采用它

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 回答