显示了在Java小程序的FTP上传文件时进度(Show progress during FTP fi

2019-06-27 13:12发布

OK,所以我必须用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);
}

Answer 1:

从它(和缺乏对contree任何证据)的声音听起来像是你的处理耗时在动作事件指派线程

你可能会喜欢读Swing中的并发一些进一步了解

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

看到源代码后更新

  1. 不要混合使用重量轻的部件重量重的部件。 更改AppletJApplet ,变化的TextFieldJTextField ,不要使用Canvas使用JPanel或者JComponent
  2. 如果你希望其他人阅读你的代码,请使用正确的名称为您的变量,我不知道p是。
  3. 你的Thread是没用的。 而不是启动线程,并使用它的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://所以我怀疑这会工作...



Answer 2:

在上载你看不到变化的图形用户界面,因为你运行的上传和在同一个线程图形用户界面的变化。 你应该开始,做的GUI更新一个threayd,做的上传和另一位在美国东部时间(事件调度线程)。

欲了解更多信息,请参阅:

  1. 事件调度线程


Answer 3:

你应该在一个SwingWorker的,这样的用户界面将必须提交进度的机会实现传输的逻辑。



文章来源: Show progress during FTP file upload in a java applet