我正在尝试从一个用分号分隔的文件中读取字符串并将它们放在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的大小是一个非常小的数字。预期的数字更大。
有什么建议吗?
答案 0 :(得分:3)
你继续覆盖inputs
的内容 - 所以一旦你到达第二个循环,它只包含你文件最后一行的数据。
所以你应该使用这样的东西:
while ((line = reader.readLine()) != null) {
Collections.addAll(lines, line.split(";"));
}
你也改进了你的计划:
Files
辅助方法:所以它看起来像:
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());
说明:
BufferedReader
个实例。lines()
以获得Stream<String>
。铌。 Streams是一个非常好的Java 8新概念,请阅读它!Stream<String>
收集到List<String>
,这可以通过在流上调用collect(Collectors.toList())
来完成。刚才我意识到你在;
上分割了这些行,很高兴我们有一个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(";")))
,其中包含从String
到Stream<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);
}
}