从文件中读取,拆分行并存储在数组JAVA中

时间:2013-05-23 16:18:00

标签: java arrays split bufferedreader readline

好的家伙首先让我说在JAVA编程时我是一个NOVICE。我正在自学,所以请说,请耐心等待,因为我尽我所能,尽我所能。话虽如此,这是我的困境!!!

我有一个存储用户名和密码字段的文件“Users.csv”。

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

我想做的是......

  1. 阅读本文档中的行(Users.csv)(与类文件位于同一目录中)
  2. 使用.split(“,”)分割线条;在输入
  3. 将分割1存储在数组[0]中,并将2分割为相同的数组[1]
  4. 当我将用户添加到文件时,数组必须能够增长。最终我想验证数组中的信息,但我现在主要关注的是如何将信息输入到数组中。这是我正在玩的东西,但我不知道如何让它做我想做的......

    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 个答案:

答案 0 :(得分:3)

我认为你的数组没有增长,因为你正在重新声明文件的每一行(它在while循环中)。 要解决此问题,您可以在循环之前初始化数组,并使用System.arraycopy使其增长。

这个快速解决方案的一部分,我认为你的想法有很多问题:

  • 用户名和密码不应存储在csv文件中,而应存储在数据库中
  • 密码应该经过哈希处理,并且永远不会从应用程序本身清晰可见
  • 数据库应该是盐渍的
  • 数组不是表示键值对的正确数据结构 - 您应该使用Map
  • 在发生时,获取内存中的所有用户名/密码以将其与用户登录进行比较是不合理的。您应该散列用户提供的密码,在数据库中查找用户名,并比较两个哈希值

我在这里简化了一下,有大量关于此的文献。

祝你好运!

答案 1 :(得分:1)

通常人们使用ArrayList作为数组。 需要知道元素总数的数组,而arraylist使用下面的数组并在必要时动态调整大小(好吧,创建一个更大的数组并复制数据)。

对于特定情况,您实际上需要一个 hashmap ,它需要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);获取存储的密码,并与用户提供的密码进行比较。

答案 2 :(得分: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();
    }

然后,您将能够使用其他地方生成的数据。

答案 3 :(得分:0)

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

我建议您创建一个User POJO class,因为明天,如果将另外一个属性添加到CSV行,可以通过在下面的类中添加一个字段来采用它/ p>

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文件中存在安全风险。尝试使用数据库并存储加密的密码而不是实际的密码(检索时只需解密密码并进行比较)