假设我有一个类< 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,这段代码不会太“吵”吗?
只需从文件中读取一次并将其保存在内存中,而不是每次都从文件中读取
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;
}
从内存的角度来看,使用迭代器不会真正节省内存-我猜您将把所有的点都读入内存,所以它们都必须以某种方式存储。
迭代器不是不同的集合类型:它只是迭代集合的不同方式。例如,您可以通过list.iterator()
让迭代器遍历您的列表(或任何集合)。
选择使用哪个集合来保存内存中的所有点将影响内存(例如。数组列表
与链接列表
)。
如果您不需要将所有点都存储在内存中,请考虑以下内容:
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