我有需要执行文件复制操作并显示用户的进度条的ICEfaces的Web应用程序。
目前,该副本是由调用“的cpio”不能给Java代码的进展,直到操作完成后进行。 虽然有可能用Java编写的监测与读取的复制进度的估计字节数字节数,我觉得可能是一个简单的解决方案,如果我在Java代码中的实际复制操作。 我仍然会使用“cpio”可以用于存档的目的,但实际拷贝将由Java类中进行。
大部分我在查找到的帮助下与progressMonitor,它采用了Swing组件,而我不知道它可以做我想做的。 所有我需要的是的,我可以养活我的JSF进度栏组件的满分为100分的进展整数/双。
我不知道你ICEFaces的,但这里是如何将文件在Java中复制并监视在命令行的进展:
import java.io.*;
public class FileCopyProgress {
public static void main(String[] args) {
System.out.println("copying file");
File filein = new File("test.big");
File fileout = new File("test_out.big");
FileInputStream fin = null;
FileOutputStream fout = null;
long length = filein.length();
long counter = 0;
int r = 0;
byte[] b = new byte[1024];
try {
fin = new FileInputStream(filein);
fout = new FileOutputStream(fileout);
while( (r = fin.read(b)) != -1) {
counter += r;
System.out.println( 1.0 * counter / length );
fout.write(b, 0, r);
}
}
catch(Exception e){
System.out.println("foo");
}
}
}
你将不得不以某种方式更新进度条,而不是中System.out.println()
我希望这可以帮助,但也许我不明白你的问题。
基本上,你应该使用监听器模式。 在这个例子中lsitener有一个方法来接受它刚写入的字节#。 它可以用总文件大小预先填充来计算百分比显示在屏幕上。
ReadableByteChannel source = ...;
WritableByteChannel dest = ...;
FileCopyListener listener = ...;
ByteBuffer buf = ByteBuffer.allocateDirect(BUFFER_SIZE);
while (src.read(buf) != -1) {
buf.flip();
int writeCount = dest.write(buf);
listener.bytesWritten(writeCount);
buf.compact();
}
buf.flip();
while (buffer.hasRemaining()) {
int writeCount = dest.write(buf);
listener.bytesWritten(writeCount);
}