gpt4 book ai didi

java - Apache Commons Net FTPClient 中止文件存储

转载 作者:搜寻专家 更新时间:2023-10-31 08:03:49 24 4
gpt4 key购买 nike

我正在开发一个小程序以允许从网络应用程序通过 FTP 上传...

发送操作工作正常,但我希望能够取消正在进行的文件存储。

我对线程不是很流利。我的第一次尝试是在取消线程中调用 ftp.abort(),但是只有在 storeFile 方法完成时才调用 abort 方法,就像发送线程正在锁定 ftp 对象一样。

所以我改了代码中断发送线程,在copy stream listener中查看。文件存储按预期停止,但 ftp.abort() 调用挂起应用程序,它永远不会完成。

有什么想法吗?

谢谢,菲利普

发送操作:

  botaoEnviar.setEnabled(false);
botaoCancelar.setEnabled(true);
textField.requestFocus();

threadEnvio = new Thread(new Runnable()
{
@Override
public void run()
{
FileInputStream fis = null;
try
{
if(arquivoSelecionado == null)
{
throw new IllegalArgumentException("Arquivo deve ser informado");
}

try
{
ftp = new FTPClient();
ftp.connect("192.168.1.243");
}
catch(Exception e)
{
throw new FtpConnectionException("Não foi possível conectar no servidor FTP", e);
}

if(!ftp.login("c001", "0AJF2J36"))
{
throw new IllegalArgumentException("Não foi possível autenticar no servidor FTP");
}

ftp.setFileType(FTPClient.BINARY_FILE_TYPE);

ftp.setCopyStreamListener(new CopyStreamAdapter()
{
@Override
public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long streamSize)
{
if(threadEnvio.isInterrupted())
{
try
{
ftp.abort();
}
catch(IOException ex)
{
handleException(ex);
}
}
else
{
int percent = (int) (totalBytesTransferred * 100 / arquivoSelecionado.length());
progressBar.setValue(percent);
}
}
});

fis = new FileInputStream(arquivoSelecionado);
if(ftp.storeFile(arquivoSelecionado.getName(), fis))
{
JOptionPane.showMessageDialog(null, "Arquivo enviado com suceso");
}
else
{
JOptionPane.showMessageDialog(null, "Não foi possível enviar o arquivo", "Erro", JOptionPane.ERROR_MESSAGE);
}

ftp.logout();
}
catch(Exception e)
{
handleException(e);
}
finally
{
if(fis != null)
{
try
{
fis.close();
}
catch(IOException ex)
{
handleException(ex);
}
}

if(ftp != null)
{
try
{
ftp.disconnect();
}
catch(IOException ex)
{
handleException(ex);
}
}

progressBar.setValue(0);
botaoEnviar.setEnabled(true);
botaoCancelar.setEnabled(false);
}
}
});
threadEnvio.start();

取消操作:

botaoCancelar.setEnabled(false);

new Thread(new Runnable()
{
@Override
public void run()
{
try
{
threadEnvio.interrupt();
}
catch(Exception ex)
{
handleException(ex);
}
finally
{
botaoCancelar.setEnabled(true);
}
}

}).start();

最佳答案

像这样中断线程是不正确的,它会导致您的线程等待几秒钟,正好是编译器在您的线程中读取的那一行

唯一可以中止 ftp 上传的方法是让线程 hibernate 一段时间

然后中止您的上传并等待线程自行完成

看这个:

try {
try {
Thread.currentThread();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

try {
mFTP.abort();
} catch (IOException e) {
e.printStackTrace();
}
} catch (NetworkOnMainThreadException e) {
e.printStackTrace();
}

关于java - Apache Commons Net FTPClient 中止文件存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17109631/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com