簡體   English   中英

使用BufferedOutputStream和SwingWorker復制文件時如何獲得進度

[英]How to get the progress when copying a file using BufferedOutputStream & SwingWorker

我正在將文件從計算機復制到外部設備(例如SD卡),並且希望在文件復制過程中獲得進度。 我正在使用SwingWorker,以便可以同時復制多個文件。 我不確定如何獲取當前進度並將其發送到SwingWorker的publish()方法。 這是我復制文件的代碼:

FileInputStream finStream = new FileInputStream(sourceFile);
FileOutputStream foutStream = new FileOutputStream(destFile);

/*
 * Adapted from http://www.java2s.com/Code/Java/File-Input Output/UseBufferedInputStreamandBufferedOutputStreamtocopybytearray.html
 */
BufferedInputStream bufIS = new BufferedInputStream(finStream);     
BufferedOutputStream bufOS = new BufferedOutputStream(foutStream);

byte[] byteBuff = new byte[32 * 1024];
int len;
while ((len = bufIS.read(byteBuff)) > 0){
    bufOS.write(byteBuff, 0, len);
    publish(/*What do I put here?*/);
}

bufIS.close();
bufOS.close();
  1. 首先找到文件的大小。 在java.io.File中使用length方法
  2. 使用“ len”變量來確定在循環的當前迭代中已復制了多少字節。
  3. 使用該數據計算百分比並使用該百分比。

注意:寫入的數據可能會寫入緩沖區,並將根據分配的緩沖區大小進行刷新(盡管這不會妨礙計算)。

Swingworker已經具有“進度功能”,使用它代替publish/process

long size = file.length();

int count = 0;
int progress;
while ((len = bufIS.read(byteBuff)) > 0) {
  ...
  count += len;
  if (size > 0L) {
    progress = (int) ((count * 100) / size);
    setProgress(progress);
  }
}

然后,您可以在EDT使用worker.getProgress()或帶有progressBar或其他PropertyChangeListener

例如:

public class MyWorker extends SwingWorker<Void, Void> implements PropertyChangeListener {

    public MyWorker() {
      addPropertyChangeListener(this);
    }

    ....
    /* Your code */
    ....

   @Override
   public void propertyChange(PropertyChangeEvent evt) {

      if ("progress".equals(evt.getPropertyName())) {
        myProgressBar.setValue((Integer) evt.getNewValue());
      }
   }

}

要么

MyWorker worker = new MyWorker();
worker.addPropertyChangeListener(new PropertyChangeListener() {

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if ("progress".equals(evt.getPropertyName())) {
            myProgressBar.setValue((Integer) evt.getNewValue());
        }
    }
}

如果您喜歡publish/processpublic class MyWorker extends SwingWorker<Void, Integer> ,您將可以使用Integer調用publish

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM