java - 在 Java 小程序中显示 FTP 文件上传过程中的进度

标签 java swing ftp applet event-dispatch-thread

好的,我让上传程序使用 Java FTP 上传文件,我想更新标签和进度条。带有百分比文本的标签,带有百分比 int 值的条形。现在,使用当前代码只能在上传结束时获得 100 和完整的栏。在上传过程中,它们都没有改变。

这里是:

    OutputStream output = new BufferedOutputStream(ftpOut);
    CopyStreamListener listener = new CopyStreamListener() {
        public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize) {
            System.out.printf("\r%-30S: %d / %d", "Sent", totalBytesTransferred, streamSize);
            ftpup.this.upd(totalBytesTransferred,streamSize);
        }
        public void bytesTransferred(CopyStreamEvent arg0) { }
    };

    Util.copyStream(input, output, ftp.getBufferSize(), f.length(), listener);      
}

public void upd(long num, long size){
    int k = (int) ((num*100)/size);
    System.out.println(String.valueOf(k));
    this.d.setText(String.valueOf(k));
    //d.setText(String.valueOf(k));
    progressBar.setValue(k);
}

最佳答案

从它的声音来看(并且缺乏任何证据),听起来你在 Event Dispatching Thread 中处理一个耗时的操作。

您可能想阅读Concurrency in Swing进一步了解

我建议使用SwingWorker执行实际传输并利用其内置的进度支持

查看源代码后更新

  1. 不要将重量级组件与轻量级组件混合在一起。将 Applet 更改为 JApplet,将 TextField 更改为 JTextField,不要使用 Canvas使用 JPanelJComponent
  2. 如果您希望其他人阅读您的代码,请为您的变量使用正确的名称,我不知道 p 是什么。
  3. 你的线程毫无用处。您只需在其构造函数中进行下载调用,而不是启动线程并使用它的 run 方法。这对你没有任何帮助......

删除 MyThread 的实现并将其替换为

public class MyWorker extends SwingWorker<Object, Object> {

    private URL host;
    private File outputFile;

    public MyWorker(URL host, File f) {
        this.host = host;
        outputFile = f;
    }

    @Override
    protected Object doInBackground() throws Exception {

        // You're ignoring the host you past in to the constructor
        String hostName = "localhost";
        String username = "un";
        String password = "pass";
        String location = f.toString();

        //FTPClient ftp = null;

        ftp.connect(hostName, 2121);
        ftp.login(username, password);

        ftp.setFileType(FTP.BINARY_FILE_TYPE);

        ftp.setKeepAlive(true);
        ftp.setControlKeepAliveTimeout(3000);
        ftp.setDataTimeout(3000); // 100 minutes
        ftp.setConnectTimeout(3000); // 100 minutes

        ftp.changeWorkingDirectory("/SSL");

        int reply = ftp.getReplyCode();
        System.out.println("Received Reply from FTP Connection:" + reply);

        if (FTPReply.isPositiveCompletion(reply)) {
            System.out.println("Connected Success");
        }
        System.out.println(f.getName().toString());

        File f1 = new File(location);
        in = new FileInputStream(f1);

        FileInputStream input = new FileInputStream(f1);
        // ftp.storeFile(f.getName().toString(),in);

        //ProgressMonitorInputStream is= new ProgressMonitorInputStream(getParent(), "st", in);
        OutputStream ftpOut = ftp.storeFileStream(f.getName().toString());


        System.out.println(ftpOut.toString());
        //newname hereSystem.out.println(ftp.remoteRetrieve(f.toString()));
        OutputStream output = new BufferedOutputStream(ftpOut);
        CopyStreamListener listener = new CopyStreamListener() {
            public void bytesTransferred(final long totalBytesTransferred, final int bytesTransferred, final long streamSize) {

                setProgress((int) Math.round(((double) totalBytesTransferred / (double) streamSize) * 100d));

            }

            @Override
            public void bytesTransferred(CopyStreamEvent arg0) {
                // TODO Auto-generated method stub
            }
        };

        Util.copyStream(input, output, ftp.getBufferSize(), f.length(), listener);

        return null;

    }
}

在你的ActionListenero(??)中将线程执行代码替换为

try {
    MyWorker worker = new MyWorker(new URL("http://localhost"), file);
    worker.addPropertyChangeListener(new PropertyChangeListener() {

        @Override
        public void propertyChange(PropertyChangeEvent evt) {
            if (evt.getPropertyName().equals("progress")) {
                Integer progress = (Integer) evt.getNewValue();
                progressBar.setValue(progress);
            }
        }
    });
    worker.execute();
} catch (MalformedURLException ex) {
    ex.printStackTrace();
}

注意。您忽略了传递给构造函数的 URL。 http://不是 ftp://所以我怀疑这是否有效...

关于java - 在 Java 小程序中显示 FTP 文件上传过程中的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12185924/

相关文章:

python - 在 Python 中显示 FTP 下载进度(ProgressBar)

java - 比较下载文件与 ftp 服务器上的远程文件的文件大小

java - 将空字符串解析为int

java - 有没有办法改变 Eclipse 中 "variable never used"下划线的颜色?

java - 是否有必要从 getter 方法返回一个与 Hibernate 传递给 setter 的对象不同的对象?

java - 将 JPanel 内的组件居中

java - Apache poi : images in spreadsheet are associated with workbook and can not be retrieved/linked with individual worksheet . 。

java - 用 Java 中的按钮打开不同的框架

java - 使用JLabel添加图片的问题

PHP FTP : Access Denied