gpt4 book ai didi

java - 如何获取读取文件的进度

转载 作者:太空宇宙 更新时间:2023-11-04 07:57:55 24 4
gpt4 key购买 nike

我正在尝试从应用程序中的文件中读取大对象。由于这可能需要一些时间,我想以某种方式将文件的读取与 JProgressBar 连接起来。有什么简单的方法可以找到读取文件的进度吗? (加载本身是在 swingworker 线程中完成的,因此更新进度条应该不是问题。)我一直在考虑重写 FileInputStream 中的 readByte() 方法以返回某种进度值,但这似乎是一种不正当的方式。非常欢迎任何有关如何实现这一点的建议。

以下是读取文件的代码:

public class MapLoader extends SwingWorker<Void, Integer> {

String path;
WorldMap map;

public void load(String mapName) {
this.path = Game.MAP_DIR + mapName + ".map";
this.execute();
}

public WorldMap getMap() {
return map;
}

@Override
protected Void doInBackground() throws Exception {
File f = new File(path);
if (! f.exists())
throw new IllegalArgumentException(path + " is not a valid map name.");
try {
FileInputStream fs = new FileInputStream(f);
ObjectInputStream os = new ObjectInputStream(fs);
map = (WorldMap) os.readObject();
os.close();
fs.close();
} catch (IOException | ClassCastException | ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}

@Override
protected void done() {
firePropertyChange("map", null, map);
}
}

最佳答案

如果是我,我不会搞乱重写 FileInputStream。我认为decorator可能很适合这里。这个想法是您创建一个传递给 ObjectInputStream 的装饰器输入流。装饰器负责更新读取进度,然后委托(delegate)给真实的输入流。

也许最简单的解决方案是使用 CountingInputStream来自 Apache commons-io 。基本步骤是:

  • 创建 CountingInputStream 的子类作为 map 加载器的非静态内部类
  • 重写 afterRead 方法。调用 super.afterRead,然后发布您的更新状态
  • 将新装饰器输入流的实例传递给输出流,将文件输入流传递给装饰器的构造函数

关于java - 如何获取读取文件的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13324154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com