我在计算文件的散列时有一个问题,例如:md5,sha1,sha256通过异步过程在progressBar中设置进度
感谢 Alejandro Duarte ,他们展示了一个非常实用的例子
我能让它工作的唯一方法是在方法第75行,我用4毫秒来处理任务并更新了条形图,但它太慢了。
是的,我没有睡眠线程,应用程序没有正确执行推送,并且更改未正确反映给客户端。
实际工作的另一种方法是使用Runnable接口并在run()方法中执行繁重的任务
@Override
public void run() {
calcularHash();
}
public void calcularHash() {
System.out.println("Path tmp archivo: " +
tmpPath.toFile().getAbsolutePath());
for(int f=0; f<hashType.size(); f++) {
try (InputStream bis = new
BufferedInputStream(Files.newInputStream(tmpPath))) {
t.initTime();
byte[] buffer = new byte[1024];
MessageDigest messageDigest =
MessageDigest.getInstance(hashType.get(f));
int dataRead = 0;
long largo = tmpPath.toFile().length();
Long acum = 0L;
while ((dataRead = bis.read(buffer)) != -1) {
messageDigest.update(buffer, 0, dataRead);
acum += dataRead;
Float per = ((float) acum / largo);
bar.setValue(per);
System.out.println(per * 100);
//textFieldPercent.setValue(Types.formatPercentaje(per *
100));
}
final byte[] bytesDigest = messageDigest.digest();
final StringBuilder sb = new StringBuilder();
for (int c = 0; c < bytesDigest.length; c++) {
sb.append(Integer.toString((bytesDigest[c] & 0xFF) + 0x100,
16).substring(1));
}
final String hashObtenido = sb.toString();
t.finishTime();
final String totalTime = t.getFinalTimeSec() + "seg " +
t.getFinalTimeMs() + "ms";
final String large = Types.getLargeFileFormat(largo);
System.out.println(hashObtenido);
ui.access(() -> {
checksumTransactions.initData(messageDigest.getAlgorithm(),
sb.toString(),large, totalTime);
});
//Files.delete(tmpPath); //fixme borrar desde el grid o UI
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
在目前的图片中,我使用了一个简单的public void run(),并且Progressbar已经很好地更新了
但是我们知道应用程序可能有内存泄漏并且不是一个好习惯,理想的是知道如何执行后台线程
我仍然不知道实现这个目标的最佳方法:$