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

Mic*_*ael 6 java file-io iterator iterable

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

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

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

Point makePoint(String line) { ... }

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

List<Point> readPoints(BufferedReader reader) {...} // use makePoint here

void handlePoints(BufferedReader reader) {
   List<Point> points = readPoints(reader); 
   handlePoints(points);
}

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

使用迭代器不是更好吗?

void handlePoints(Iterator<Point> points) {...}

Iterator<Point> readPoints(BufferedReader reader) {...} // use makePoint here

void handlePoints(BufferedReader reader) {
   Iterator<Point> points = readPoints(reader); 
   handlePoints(points);
}

是否有意义?这个代码在Java中不会太"吵"吗?

Duk*_*ing 8

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

while (reader.ready())
{
  String line = reader.readLine();
  Point point = makePoint(line);
  handlePoint(point);
}
Run Code Online (Sandbox Code Playgroud)

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

class PointIterator implements Iterator<Point>
{
  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!"); };
}
Run Code Online (Sandbox Code Playgroud)

因为handlePoints需要Iterable:

class PointIterable implements Iterable<Point>
{
  BufferedReader reader;
  public PointIterable(BufferedReader myReader) { reader = myReader; };
  @Override
  public Iterator<Point> iterator() { return new PointIterator(reader); }
}
Run Code Online (Sandbox Code Playgroud)

使用:

handlePoints(new PointIterable(reader));
Run Code Online (Sandbox Code Playgroud)