使用java从文件读取字符串到arraylist

时间:2014-03-02 17:46:37

标签: java arraylist

我正在尝试从一个用分号分隔的文件中读取字符串并将它们放在arrayList中。这是我的代码:

public ArrayList<String> readFile() throws IOException{
   lines=new ArrayList<String>();

   BufferedReader reader = new BufferedReader(new FileReader("D:\\input.txt"));
   String line = null;
   while ((line = reader.readLine()) != null) {
       inputs = line.split(";");
   }
   reader.close();
   for (String in : inputs) {
        lines.add(in);
    }
    System.out.println(lines.size());
       return lines;

   }

当我运行它时,返回的ArrayList的大小是一个非常小的数字。预期的数字更大。

有什么建议吗?

4 个答案:

答案 0 :(得分:3)

你继续覆盖inputs的内容 - 所以一旦你到达第二个循环,它只包含你文件最后一行的数据。

所以你应该使用这样的东西:

while ((line = reader.readLine()) != null) {
   Collections.addAll(lines, line.split(";"));
}

你也改进了你的计划:

  • 使用Files辅助方法:
  • 通过更恰当地命名变量(行确实包含每行上的标记)
  • 返回一个接口而不是一个具体的实现(List vs ArrayList)。

所以它看起来像:

public List<String> readFile() throws IOException {
    List<String> lines = Files.readAllLines(Paths.get("D:/input.txt"));

    List<String> tokens = new ArrayList<>();
    for (String line : lines) {
        Collections.addAll(tokens, line.split(";"));
    }
    return tokens;
}

答案 1 :(得分:3)

嗯......首先回答你的问题:lines.size()在程序结束时非常小,因为你首先通过readLine()遍历所有行,并覆盖readLine().split(";")的值每次迭代都在inputs上。然后在程序结束之前,添加最后行的内容,将“;”拆分为lines

解决方案是移动for - 循环,将分割线添加到while循环内的循环中。

另请注意,您可以调用lines.addAll(inputs)将所有这些内容添加到lines,然后您不需要循环它们,这实际上会使您的代码混乱,因为这是一个不必要的操作。

这也可以在Java 8中以下列方式完成:

    try {
        List<String> lines = new BufferedReader(new FileReader("D:\\input.txt")).lines().collect(Collectors.toList());
    } catch (FileNotFoundException ex) {
        Logger.getLogger(MultiMapJava8.class.getName()).log(Level.SEVERE, null, ex);
    }

假设您有reader可用,它甚至可以简单:

List<String> lines = reader.lines().collect(Collectors.toList());

说明:

  1. 获取BufferedReader个实例。
  2. 在其上调用lines()以获得Stream<String>。铌。 Streams是一个非常好的Java 8新概念,请阅读它!
  3. Stream<String>收集到List<String>,这可以通过在流上调用collect(Collectors.toList())来完成。
  4. 刚才我意识到你在;上分割了这些行,很高兴我们有一个Stream<String>,现在的代码是:

    BufferedReader reader = new BufferedReader(new FileReader("D:\\input.txt"));
    List<String> lines = reader.lines()
            .flatMap(line -> Arrays.stream(line.split(";")))
            .collect(Collectors.toList());
    

    添加的额外步骤是flatMap(line -> Arrays.stream(line.split(";"))),其中包含从StringStream<String>的lambda表达式,其中已通过从line.split(";")创建流来创建流,返回String[]
    所有flatMap(...)都会将这些结果元素添加回原始Stream<String>中,因此它是一种扩展方法。

答案 2 :(得分:1)

您在每次迭代时覆盖inputs,并在退出循环时以最后一行结束。更像是

while ((line = reader.readLine()) != null) {
   inputs = line.split(";");

   for (String in : inputs) {
       lines.add(in);
    }
}

答案 3 :(得分:1)

在循环中添加String列表的迭代,然后在它之外,因为只有最后一个条目插入到列表中

while ((line = reader.readLine()) != null) {
       inputs = line.split(";");

       for (String in : inputs) {
            lines.add(in);
        }
   }