迭代器用Java读取和处理文件

假设我有一个Point类和一个处理Point实例的函数

 class Point {private final int x,y;  ...} 
 ...
 void handlePoints(Iterable  points){for(Point p:points){...}}

现在我想从文件中读取points 。 该文件的每一行包含两个数字,因此我有一个函数(“工厂方法”)来从一行创建一个point

点makePoint(String line){...}

我现在应该怎么做? 我可以编写一个函数来将文件读取到一个points列表并调用handlePoints函数。

 List  readPoints(BufferedReader reader){...} //在这里使用makePoint

 void handlePoints(BufferedReader reader){
    List  points = readPoints(reader); 
    handlePoints(分);
 }

不幸的是,这个function似乎并不特别优雅,因为它在内存中创建了一个不必要的点列表。

使用迭代器不是更好吗?

 void handlePoints(Iterator  points){...}

 Iterator  readPoints(BufferedReader reader){...} //在这里使用makePoint

 void handlePoints(BufferedReader reader){
    Iterator  points = readPoints(reader); 
    handlePoints(分);
 }

是否有意义? 这段代码在Java中不会太“吵”吗?

如果你不需要记忆中的所有点,那么请考虑以下几点:

 while (reader.ready()) { String line = reader.readLine(); Point point = makePoint(line); handlePoint(point); } 

如何使用迭代器和handlePoints执行此操作:(用于处理要添加的exception的代码)

 class PointIterator implements Iterator { BufferedReader reader; PointIterator(BufferedReader myReader) { reader = myReader; }; @Override public boolean hasNext() { return myReader.ready(); }; @Override public Point next() { return makePoint(myReader.readLine()); }; @Override public void remove() { throw new UnsupportedOperationException("Remove not supported!"); }; } 

因为handlePoints采用Iterable

 class PointIterable implements Iterable { BufferedReader reader; public PointIterable(BufferedReader myReader) { reader = myReader; }; @Override public Iterator iterator() { return new PointIterator(reader); } } 

使用:

 handlePoints(new PointIterable(reader)); 

从内存的角度来看,你不会通过使用迭代器来真正保存任何内存 – 我猜你会把所有的点都读到内存中,所以它们都必须以某种方式存储。

迭代器不是一个不同的集合类型:它只是一种迭代集合的不同方式。 例如,您可以使用list.iterator()来获取循环遍历列表(或任何集合)的迭代器。

选择用于保存内存中所有点的集合是影响内存的集合(例如, ArrayListLinkedList )。

只需从文件中读取一次并将其放在内存中,而不是每次从文件中读取

 List points ; public List readPoints(BufferedReader reader) { if(points == null) { points = new ArrayList(); // read from file and populate points.add(point) ; } return points; }