java ftp 下载 多线程_Java-多线程FTP下载

我正在尝试处理包含多个目录的某个FTP目录,这些目录又具有任意数量的文件.所以我想做的是为每个子目录设置1个线程,而每个线程都要与各自的子目录相关,这就是我的想法:

private void fetchFilesFromFTP() {

try {

client.connect("ftp.ncbi.nih.gov");

client.login("anonymous", "anonymous");

client.changeWorkingDirectory("genomes/Fungi");

FTPFile dirs[] = client.listDirectories();

dirsToDl.addAndGet(dirs.length);

for (final FTPFile ftpFile : dirs) {

exec.execute(new Runnable() {

//process each FTP directory in a new thread

@Override

public void run() {

processFTPdir(ftpFile.getName());

}

});

}

} catch (SocketException ex) {

Logger.getLogger(FungiProcessor.class.getName()).log(Level.SEVERE, null, ex);

} catch (IOException ex) {

Logger.getLogger(FungiProcessor.class.getName()).log(Level.SEVERE, null, ex);

}

}

private void processFTPdir(String dir) {

File f = new File(destination + File.separator + dir);

if (!f.mkdirs()) {

System.out.println("Error creating dir for " + dir);

return;

}

FTPFile files[];

try {

//we are already in the correct directory

files = client.listFiles(dir, new FTPFileFilter() {

@Override

public boolean accept(FTPFile ftpf) {

return ftpf.getName().endsWith(".gbk");

}

});

for (FTPFile fTPFile : files) {

FileOutputStream fout = new FileOutputStream(destination + File.separator + dir + File.separator + fTPFile.getName());

if (client.retrieveFile(dir + "/" + fTPFile.getName(), fout)) {

System.out.println("successfully downloaded");

fout.flush();

fout.close();

}

System.out.println(client.getReplyString());

}

} catch (IOException ex) {

Logger.getLogger(FungiProcessor.class.getName()).log(Level.SEVERE, null, ex);

} finally {

if(dirsToDl.decrementAndGet() == 0) latch.countDown();

}

}

代码的顺序版本有效-我可以看到以.gbk结尾的文件实际上正在下载,而在多线程版本中,仅创建了相应的子目录,而没有下载文件.我什至没有任何错误. FTP是否可能一次不支持多个文件下载?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值