在Java小程序中上传FTP文件期间显示进度

好的,这样我就可以使用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);

}

回答:

从它的声音(并且没有任何证据可以证明主观)看来,您在事件调度线程中处理一个耗时的动作

您可能想阅读Swing中的并发性以获得更多了解

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

  1. 不要将重组分与轻组分混合。更改AppletJApplet,更改TextFieldJTextField,请勿Canvas使用a JPanelJComponent
  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://,所以我怀疑这是否有效…

以上是 在Java小程序中上传FTP文件期间显示进度 的全部内容, 来源链接: utcz.com/qa/397593.html

回到顶部