首页 文章

如何在ICEfaces中显示Java文件复制操作的进度?

提问于
浏览
4

我有一个ICEfaces Web应用程序,需要执行文件复制操作并向用户显示进度条 .

目前,复制是通过调用'cpio'来完成的,该操作在操作完成之后才能使Java代码进展 . 虽然可以使用Java来监视写入的字节数与读取的字节数以估计复制进度,但我认为如果我用Java编写实际的复制操作,可能会有一个更简单的解决方案 . 我仍然会使用'cpio'进行存档,但实际的副本将由Java类执行 .

我在搜索中发现的大多数帮助都与progressMonitor有关,它包含一个swing组件,我不确定它能做我想做的事情 . 我只需要一个整数/两倍的进度,我可以将其作为100%的百分比提供给我的JSF进度条组件 .

2 回答

  • 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() . 我希望这会有所帮助,但也许我不明白你的问题 .

  • 5

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

相关问题