这是我的代码:
class Copy extends SwingWorker<Void, Void> {
private File selectedfile = new File("D:/Adatok/proba.file");
private File chosenDestination = new File("D:/Adatok/ide/proba.file");
@Override
protected Void doInBackground() throws Exception {
try {
FileInputStream fileInputStream = new FileInputStream(
selectedfile);
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
ProgressMonitorInputStream progressMonitorInputStream;
progressMonitorInputStream = new ProgressMonitorInputStream(Panel.this,"Copying...", bufferedInputStream);
File outputFile = new File("" + chosenDestination);
FileOutputStream fileOutputStream = new FileOutputStream(outputFile);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
int data;
byte[] buffer = new byte[1024];
while ((data = progressMonitorInputStream.read(buffer)) > 0) {
bufferedOutputStream.write(buffer);
}
bufferedOutputStream.close();
progressMonitorInputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
public void done() {
JOptionPane.showMessageDialog(Panel.this, "Ready!", "Done", 1);
}
}
}
它适用于较小的文件,但如果我尝试使用 3GB 文件,进度条会显示错误的进度。当达到 100% 时,复制尚未完成,在剩余时间内进度条将设置为 0%
并且不会移动。这是怎么回事?
最佳答案
我知道这已经很旧了,但多年来我不止一次地发现这个线程,同时必须解决同样的问题。这是一个bug正如 @Roberto 所指出的,在 Java 中。我做了一个与错误报告者发布的类似的解决方法。
- 我复制了 ProgessMonitorInputStream 的源代码并创建了一个名为 ProgessMonitorInputStreamLongBased 的新类以避免混淆
- 我检查文件的大小(以字节为单位),看看它是否大于 Integer.MAX_VALUE:
- 如果小于则没有变化。
- 如果大于 max size,则为最大 int 值,并将执行缩放。
- 比例尺被找到一次,它等于先前找到的“大小”除以文件的实际长度。
我希望这可以帮助遇到此问题的其他人。
关于java - ProgressMonitorInputStream - 进度条不显示真实进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14479640/