5

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

目前,复制是通过调用完成的,cpio在操作完成之前无法给 Java 代码提供进度。虽然可以使用 Java 监控写入的字节数与读取的字节数以估计复制进度,但我认为如果我用 Java 编写实际的复制操作,可能会有更简单的解决方案。我仍将cpio用于归档目的,但实际副本将由 Java 类执行。

我在搜索中找到的大部分帮助都与progressMonitor 有关,它包含了一个swing 组件,我不确定它是否可以做我想要的。我所需要的只是一个整数/双倍的进度,我可以将它作为 100 的百分比提供给我的 Web 应用程序的进度条组件。

4

2 回答 2

7

以下是如何在 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(). 我希望这会有所帮助,但也许我不明白你的问题。

于 2012-06-25T02:12:11.123 回答
1

基本上,您应该使用侦听器模式。在这个例子中,监听器有一个方法来接受刚刚写入的字节数。它可以预先填充总文件大小,以计算要在屏幕上显示的百分比。

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);
}
于 2012-06-25T03:05:37.703 回答