将文本文件数据添加到Arraylist

时间:2017-01-20 10:30:58

标签: java arraylist

我想将文本文件数据添加到ArrayList。 这是我的文本文件

60000115 2016-10-26-05:57:47                   
60000104 2016-10-26-05:58:27                   
60000082 2016-10-26-05:58:38                   
60000074 2016-10-26-06:01:04              

我使用 space 分割数据。所以有两个部分。 ID和日期。 我创建了一个名为Employee的bean类,它有两个名为user_id和mDate的String。 employeArrayList是我使用Employee类创建的ArrayList。 问题是我无法为Arraylist添加值。只有最后一行数据插入到ArrayList中。例如: - 60000074 2016-10-26-06:01:04 。 四行 60000074 2016-10-26-06:01:04

这是我的代码。

    for (File f : files) {
        FileInputStream fis;
        try {
            fis = new FileInputStream(f);
            BufferedReader in = new BufferedReader(new InputStreamReader(fis));

            String aLine;
            while ((aLine = in.readLine()) != null) {
                String[] tokens = aLine.split(" ");

                emp.setUser_id(tokens[0]);
                emp.setmDate(tokens[1]);
                employeArrayList.add(emp);

                out.write(aLine);
                out.newLine();

            }

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

6 个答案:

答案 0 :(得分:4)

每次创建一个新的Employee对象:

while ((aLine = in.readLine()) != null) {
    String[] tokens = aLine.split(" ");

    Employee emp = new Employee();
    emp.setUser_id(tokens[0]);
    emp.setmDate(tokens[1]);
    employeArrayList.add(emp);

    out.write(aLine);
    out.newLine();
}

原始代码的问题在于您重复使用同一个对象emp。这意味着您将相同的对象重复插入列表中。当您在循环的每次迭代中更改该对象的字段时,您会影响列表中的每个条目。通过将emp限定为循环,它不会被回收,您的代码应该按预期工作。

答案 1 :(得分:3)

问题是您反复更新相同的 \ temp> / 对象。

您必须为每次迭代创建一个 new ;并添加它。

此外:你应该只使用"豆"在使用需要它们的框架时,使用 setter 作为核心属性。

换句话说:你的bean类应该更像

public class EmplyoeeBeen {
  private final String id;
  private final String date;

  public EmplyoeeBeen(String id, String date) {
    this.id = id;
  ...

你在这个课上只有 getters ,没有制定者!而且:你可能也想要很好的equals / hashCode方法。

最后:对命名保持一致:不要使用" _"下划线(它们只进入CONSTANT_NAMES);并使用" m"等前缀。 + fieldname ...一直;或永远不会。但是不要去找userId和mDate!

但最重要的是:避免字符串化输入。我的意思是:ID 一个字符串。日期日期。当你的字段带有含义;然后使用**类来表示具有该含义的那些。例如,您可以创建自己的Id类;并且肯定:您希望将日期字符串转换为真正的Date对象。

答案 2 :(得分:1)

这是因为您每次都没有创建新员工对象。像下面一样更改你的代码,这样每次都不会采用相同的对象

for (File f : files) {
        FileInputStream fis;
        try {
            fis = new FileInputStream(f);
            BufferedReader in = new BufferedReader(new InputStreamReader(fis));

            String aLine;
            while ((aLine = in.readLine()) != null) {
                String[] tokens = aLine.split(" ");
                Employee emp=new Employee(); //create new object of employee
                emp.setUser_id(tokens[0]);
                emp.setmDate(tokens[1]);
                employeArrayList.add(emp);

                out.write(aLine);
                out.newLine();

            }

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

答案 3 :(得分:1)

每次都无需创建令牌变量。由于字符串不可变类,您可以直接重新分配该值。

String[] tokens = null;
for (File f : files) {
    FileInputStream fis;
    try {
        fis = new FileInputStream(f);
        BufferedReader in = new BufferedReader(new InputStreamReader(fis));
        String aLine;
        while ((aLine = in.readLine()) != null) {
            Employee emp = new Employee();
            tokens = aLine.split(" ");
            emp.setUser_id(tokens[0]);
            emp.setmDate(tokens[1]);
            employeArrayList.add(emp);

            out.write(aLine);
            out.newLine();

        }

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

每次为每一行创建Employee对象。

  

另一种最好的方法是以可以直接将数据保存到bean的方式保存数据。   以JSON格式保存。并使用GSON解析该数据。您可以在Bean中使用用户数据数组作为 ArrayList

答案 4 :(得分:0)

Please Try This

List <String,String> emp = new ArrayList<String,String>();

emp.add(tokens[0],tokens[1]);

答案 5 :(得分:0)

问题:您通过更改值使用相同的对象。它将反映最新的值,但是该数组列表中的所有值都会将单个对象指向Memory。

1.创建Employee在循环内部,以便为每次迭代创建新对象。

  1. 克隆员工对象并将其添加到列表中