当前位置: 首页 > 知识库问答 >
问题:

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

戚育
2023-03-14

假设我有一个类< code>Point和一个函数来处理< code>Point实例

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

现在我想从一个文件中读取<code>点

Point makePoint(String line) { ... }

我现在该怎么办?我可以编写一个函数将文件读取到< code>points列表中,并调用< code>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,这段代码不会太“吵”吗?

共有3个答案

蓝泰平
2023-03-14

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

List<Points> points ;

public List<Point> readPoints(BufferedReader reader) {
     if(points == null) {
        points = new ArrayList();
        // read from file and populate 
        points.add(point) ;
     }
 return points;
} 
鱼宜
2023-03-14

内存的角度来看,使用迭代器不会真正节省内存-我猜您将把所有的点都读入内存,所以它们都必须以某种方式存储。

迭代器不是不同的集合类型:它只是迭代集合的不同方式。例如,您可以通过list.iterator()让迭代器遍历您的列表(或任何集合)。

选择使用哪个集合来保存内存中的所有点将影响内存(例如。数组列表链接列表)。

太叔睿
2023-03-14

如果您不需要将所有点都存储在内存中,请考虑以下内容:

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

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

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!"); };
}

因为< code>handlePoints采用< code>Iterable:

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

使用方法:

handlePoints(new PointIterable(reader));
 类似资料:
  • 除非我能在确保输入文件是用UTF-8编码后使测试工作,否则什么是基本错误,我真正感兴趣的问题是: 上面的方法是否保证了UTF-8文件中的缺陷也被逐个复制,或者将字符加载到的过程是否改变了这一点?

  • 问题内容: 我需要使用Java来读取和处理一些较大的文件,并且我想知道,是否有某种明智的方法来保护文件,使其在我读取和处理文件时不会被其他进程覆盖? 也就是说,可以通过某种方式将其设为只读,使其保持“打开”状态或类似的方式。 这将在Windows环境中完成。 br,Touko 问题答案: 你想要一个FileLock: 为了简单起见,我省略了一个try / finally块,但您不应该在生产代码中使

  • 本文向大家介绍Lua读取和写入文件处理例子,包括了Lua读取和写入文件处理例子的使用技巧和注意事项,需要的朋友参考一下 一、文件读存: 二、非循环表格处理:

  • 我正在尝试创建一个应用程序,该应用程序使用spring-batch-excel扩展名来读取用户通过web界面上传的Excel文件,以便解析Excel文件中的地址。 当代码运行时,没有错误,但我得到的只是我日志中的以下内容。即使我的处理器和Writer中都有log/syso(它们从未被调用过,我所能想象的是它没有正确读取文件,也没有返回要处理/写入的数据)。是的,这个文件有数据,实际上有几千条记录。

  • 我知道匹配模式解析器,这是Spring批处理提供的。我需要关于如何构造批处理作业的帮助,以便它可以读取循环中的记录类型5和记录类型6。

  • 本文向大家介绍VBS和bat批处理逐行读取文件实例,包括了VBS和bat批处理逐行读取文件实例的使用技巧和注意事项,需要的朋友参考一下 首先是批处理的,很简单,每隔两秒钟读取一行。 更直观的: 当然如果你想做更多其他的事 do 后面是你发挥的地方 VBS的两个版本 第一种方式,逐行读取,依次显示: 第二种方式,全部读取,依次显示: VBS读取文本最后一行: Const ForReading = 1