[英]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();
注意:寫入的數據可能會寫入緩沖區,並將根據分配的緩沖區大小進行刷新(盡管這不會妨礙計算)。
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/process
則public class MyWorker extends SwingWorker<Void, Integer>
,您將可以使用Integer調用publish
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.