怎样才能显示ICEfaces的Java文件复制操作的进度?(How does one show pr

2019-07-30 02:09发布

我有需要执行文件复制操作并显示用户的进度条的ICEfaces的Web应用程序。

目前,该副本是由调用“的cpio”不能给Java代码的进展,直到操作完成后进行。 虽然有可能用Java编写的监测与读取的复制进度的估计字节数字节数,我觉得可能是一个简单的解决方案,如果我在Java代码中的实际复制操作。 我仍然会使用“cpio”可以用于存档的目的,但实际拷贝将由Java类中进行。

大部分我在查找到的帮助下与progressMonitor,它采用了Swing组件,而我不知道它可以做我想做的。 所有我需要的是的,我可以养活我的JSF进度栏组件的满分为100分的进展整数/双。

Answer 1:

我不知道你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() 我希望这可以帮助,但也许我不明白你的问题。



Answer 2:

基本上,你应该使用监听器模式。 在这个例子中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);
}


文章来源: How does one show progress of a Java file copy operation in ICEfaces?