【问题标题】:ProgressMonitorInputStream - progress bar doesn't show the real progressProgressMonitorInputStream - 进度条不显示实际进度
【发布时间】:2013-01-23 12:22:36
【问题描述】:

这是我的代码:

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% 并且不会移动。它有什么问题?

【问题讨论】:

  • 为了尽快获得更好的帮助,请发布SSCCE 尽管请注意,即使从 sn-p 我也得到了“错误”的印象。确保println() java.vendor & java.version 的系统属性。另请检查 Java 理解的 File.length() 是否符合您的期望。
  • 你需要setProgress(),比如here
  • 3Gb 大于 2147483647 (2^31 - 1) 这意味着你正在溢出(超过Integer.MAX_INT_VALUE)。
  • 那么,我需要使用什么 tpye?在哪里?
  • 我发现了这个:bugs.sun.com/bugdatabase/view_bug.do?bug_id=6445283 任何解决方案?

标签: java swing file-io progress-bar progressmonitor


【解决方案1】:

我知道这已经过时了,但多年来我不止一次地发现了这个帖子,同时不得不解决同样的问题。正如@Roberto 所指出的,它是Java 中的bug。我做了一个与错误报告者发布的类似的解决方法。

  1. 我复制了 ProgessMonitorInputStream 的源并创建了一个名为 ProgessMonitorInputStreamLongBased 的新类以避免混淆
  2. 我检查文件的大小(以字节为单位),看看它是否大于 Integer.MAX_VALUE:
    • 如果小于则没有变化。
    • 如果大于 max size 是最大 int 值并且将执行缩放。
  3. 比例尺找到一次,它等于之前找到的“大小”除以文件的实际长度。

我希望这可以帮助遇到此问题的其他人。

【讨论】:

    猜你喜欢
    • 2022-12-18
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2016-09-13
    相关资源
    最近更新 更多