我有非常大的csv文件,我试图通过迭代。我正在使用opencsv,我想使用CsvToBean,这样我就可以从数据库动态设置列映射。我的问题是如何做到这一点,而不抓住整个文件并将其扔到列表中。我试图防止记忆错误。
我目前将整个结果集传递到一个列表中,如下所示。
List<MyOption> myObjects = csv.parse(strat, getReader("file.txt"));
for (MyObject myObject : myObjects) {
System.out.println(myObject);
}
但是我发现了这个迭代器方法,我想知道这是否会一次迭代每一行而不是整个文件?
Iterator myObjects = csv.parse(strat, getReader("file.txt")).iterator();
while (myObjects.hasNext()) {
MyObject myObject = (MyObject) myObjects.next();
System.out.println(myObject);
}
我的问题是Iterator和list的区别是什么?
增强的for循环(for (MyObject myObject : myObjects)
)是使用Iterator
实现的(它要求csv.parse(strat, getReader("file.txt"))
返回的实例实现Iterable
接口,其中包含一个返回Iterator
的iterator()
方法),因此两个代码片段之间没有性能差异。
p。S
在第二个代码片段中,不要使用原始的Iterator
类型,使用Iterator<MyObject>
:
Iterator<MyObject> myObjects = csv.parse(strat, getReader("file.txt")).iterator();
while (myObjects.hasNext()) {
MyObject myObject = myObjects.next();
System.out.println(myObject);
}
" Iterator和list的区别是什么?"
List是一种数据结构,它为用户提供了get()、toArray()等功能。
只有在数据结构实现了iterator接口(所有数据结构都实现了iterator接口)的情况下,迭代器才能允许用户在数据结构中导航
所以List<MyOption> myObjects = csv.parse(strat, getReader("file.txt"));
物理地将数据存储在myObjects
和Iterator myObjects = csv.parse(strat, getReader("file.txt")).iterator();
只使用csv.parse