iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java多线程实现FTP批量上传文件
  • 923
分享到

Java多线程实现FTP批量上传文件

2024-04-02 19:04:59 923人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

本文实例为大家分享了Java多线程实现FTP批量上传文件的具体代码,供大家参考,具体内容如下 1、构建FTP客户端 package cn.com.pingtech.common.ft

本文实例为大家分享了Java多线程实现FTP批量上传文件的具体代码,供大家参考,具体内容如下

1、构建FTP客户端

package cn.com.pingtech.common.ftp;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import java.io.*;
import java.net.UnknownHostException;

@Slf4j
public class  FtpConnection {

    private FTPClient ftp = new FTPClient();

    private boolean is_connected = false;

    
    public FtpConnection() {
        is_connected = false;
        ftp.setDefaultTimeout(FtpConfig.defaultTimeoutSecond * 1000);
        ftp.setConnectTimeout(FtpConfig.connectTimeoutSecond * 1000);
        ftp.setDataTimeout(FtpConfig.dataTimeoutSecond * 1000);
        try {
            initConnect(FtpConfig.host, FtpConfig.port, FtpConfig.user, FtpConfig.passWord);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    
    private void initConnect(String host, int port, String user, String password) throws IOException {
        try {
            ftp.connect(host, port);
        } catch (UnknownHostException ex) {
            throw new IOException("Can't find FTP server '" + host + "'");
        }
        int reply = ftp.getReplyCode();//220 连接成功
        if (!FTPReply.isPositiveCompletion(reply)) {
            disconnect();
            throw new IOException("Can't connect to server '" + host + "'");

        }
        if (!ftp.login(user, password)) {
            is_connected = false;
            disconnect();
            throw new IOException("Can't login to server '" + host + "'");
        } else {
            is_connected = true;
        }
    }

    
    public boolean upload(String path, String ftpFileName, File localFile) throws IOException {
        boolean is  = false;
        //检查本地文件是否存在
        if (!localFile.exists()) {
            throw new IOException("Can't upload '" + localFile.getAbsolutePath() + "'. This file doesn't exist.");
        }
        //设置工作路径
        setWorkingDirectory(path);
        //上传
        InputStream in = null;
        try {
            //被动模式
            ftp.enterLocalPassiveMode();
            in = new BufferedInputStream(new FileInputStream(localFile));
            //保存文件
            is = ftp.storeFile(ftpFileName, in);
        }catch (Exception e){
            e.printStackTrace();
        }
        finally {
            try {
                in.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return is;
    }

    
    public void disconnect() throws IOException {
        if (ftp.isConnected()) {
            try {
                ftp.loGout();
                ftp.disconnect();
                is_connected = false;
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }

    
    private boolean setWorkingDirectory(String dir) {
        if (!is_connected) {
            return false;
        }
        //如果目录不存在创建目录
        try {
            if (createDirecroty(dir)) {
                return ftp.changeWorkingDirectory(dir);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;

    }

    
    public boolean isConnected() {
        return is_connected;
    }

    
    private boolean createDirecroty(String remote) throws IOException {
        boolean success = true;
        String directory = remote.substring(0, remote.lastIndexOf("/") + 1);
        // 如果远程目录不存在,则递归创建远程服务器目录
        if (!directory.equalsIgnoreCase("/") && !ftp.changeWorkingDirectory(new String(directory))) {
            int start = 0;
            int end = 0;
            if (directory.startsWith("/")) {
                start = 1;
            } else {
                start = 0;
            }
            end = directory.indexOf("/", start);
            while (true) {
                String subDirectory = new String(remote.substring(start, end));
                if (!ftp.changeWorkingDirectory(subDirectory)) {
                    if (ftp.makeDirectory(subDirectory)) {
                        ftp.changeWorkingDirectory(subDirectory);
                    } else {
                        log.error("Mack directory error :/" + subDirectory);
                        return false;
                    }
                }
                start = end + 1;
                end = directory.indexOf("/", start);
                // 检查所有目录是否创建完毕
                if (end <= start) {
                    break;
                }
            }
        }
        return success;
    }

}

2、FTP连接工厂

package cn.com.pingtech.common.ftp;

import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.util.concurrent.ArrayBlockingQueue;



@Slf4j
public class FtpFactory {

    //有界队列
    private static final ArrayBlockingQueue<FtpConnection> arrayBlockingQueue = new ArrayBlockingQueue<>(FtpConfig.ftpConnectionSize);


    protected FtpFactory(){
        log.info("init ftpConnectionSize "+FtpConfig.ftpConnectionSize);
        for(int i = 0; i< FtpConfig.ftpConnectionSize; i++){
            //表示如果可能的话,将 e 加到 BlockingQueue 里,即如果 BlockingQueue 可以容纳,则返回 true,否则返回 false
            arrayBlockingQueue.offer(new FtpConnection());
        }
    }

    

    public FtpConnection getFtp() {
        FtpConnection poll = null;
        try {
            //取走 BlockingQueue 里排在首位的对象,若 BlockingQueue 为空,阻断进入等待状态直到 Blocking 有新的对象被加入为止
            poll = arrayBlockingQueue.take();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return poll;
    }

    
    public boolean relase(FtpConnection ftp){
        return arrayBlockingQueue.offer(ftp);
    }

    

    public void remove(FtpConnection ftp) {
        arrayBlockingQueue.remove(ftp);
    }

    
    public void close() {
        for (FtpConnection connection : arrayBlockingQueue) {
            try {
                connection.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


}

3、FTP配置

package cn.com.pingtech.common.ftp;



public class FtpConfig {

    public static int defaultTimeoutSecond = 10;
    public static int connectTimeoutSecond = 10;
    public static int dataTimeoutSecond = 10;
    public static String host = "127.0.0.1";
    public static int port =9999;
    public static String user = "Administrator";
    public static String password ="Yp886611";
    public static int threadPoolSize = 1;
    public static int ftpConnectionSize = 1;
    
}

4、构建多线程FTP上传任务

package cn.com.pingtech.common.ftp;

import java.io.File;
import java.io.IOException;
import java.util.concurrent.Callable;



public class UploadTask implements Callable{
    private File file;

    private FtpConnection ftp;

    private String path;

    private String fileName;

    private FtpFactory factory;

    public UploadTask(FtpFactory factory,FtpConnection ftp, File file, String path, String fileName){

        this.factory = factory;

        this.ftp = ftp;

        this.file = file;

        this.path = path;

        this.fileName = fileName;

    }

    @Override
    public UploadResult call() throws Exception {
        UploadResult result = null;
        try {
            if (ftp == null) {
                result = new UploadResult(file.getAbsolutePath(), false);
                return result;
            }
            //如果连接未开启 重新获取连接
            if (!ftp.isConnected()) {
                factory.remove(ftp);
                ftp = new FtpConnection();
            }

            //开始上传
            result = new UploadResult(file.getName(), ftp.upload(path, fileName, file));
        } catch (IOException ex) {
            result = new UploadResult(file.getName(), false);
            ex.printStackTrace();
        } finally {
            factory.relase(ftp);//释放连接
        }
        return result;

    }
}
package cn.com.pingtech.common.ftp;

public class UploadResult {
    private String fileName; //文件名称
    private boolean result; //是否上传成功

    public UploadResult(String fileName, boolean result) {
        this.fileName = fileName;
        this.result = result;
    }

    public String getFileName() {
        return fileName;

    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public boolean isResult() {
        return result;
    }

    public void setResult(boolean result) {
        this.result = result;
    }

    public String toString() {
        return "[fileName=" + fileName + " , result=" + result + "]";
    }
}

注意:实现Callable接口的任务线程能返回执行结果
Callable接口支持返回执行结果,此时需要调用FutureTask.get()方法实现,此方法会阻塞线程直到获取“将来”的结果,当不调用此方法时,主线程不会阻塞

5、FTP上传工具

package cn.com.pingtech.common.ftp;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;




public class FtpUtil {

    

    public static synchronized List upload(String ftpPath, File[] listFiles) {
        //构建线程池
        ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(FtpConfig.threadPoolSize);
        List<Future> results = new ArrayList<>();
        //创建n个ftp链接
        FtpFactory factory = new FtpFactory();
        for (File file : listFiles) {
            FtpConnection ftp = factory.getFtp();//获取ftp con
            UploadTask upload = new UploadTask(factory,ftp, file, ftpPath, file.getName());
            Future submit = newFixedThreadPool.submit(upload);
            results.add(submit);
        }

        List listResults = new ArrayList<>();
        for (Future result : results) {
            try {
                //获取线程结果
                UploadResult uploadResult = (UploadResult)result.get(30, TimeUnit.MINUTES);
                listResults.add(uploadResult);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        factory.close();
        newFixedThreadPool.shutdown();
        return listResults;
    }

}

6、测试上传

package cn.com.pingtech.common.ftp


class Client {
    public static void main(String[] args) throws IOException {
        String loalPath = "C:\\Users\\Administrator\\Desktop\\test\\0";
        String ftpPath = "/data/jcz/";
        File parentFile = new File(loalPath);
        List <UploadResult> list = FtpUtil.upload(ftpPath,parentFile.listFiles());
        for(UploadResult vo:list){
            System.out.println(vo);
        }
        
    }
}

注意:FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: Java多线程实现FTP批量上传文件

本文链接: https://www.lsjlt.com/news/152398.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java多线程实现FTP批量上传文件
    本文实例为大家分享了Java多线程实现FTP批量上传文件的具体代码,供大家参考,具体内容如下 1、构建FTP客户端 package cn.com.pingtech.common.ft...
    99+
    2024-04-02
  • Java多线程怎么实现FTP批量上传文件
    这篇文章主要介绍了Java多线程怎么实现FTP批量上传文件的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java多线程怎么实现FTP批量上传文件文章都会有所收获,下面我们一起来看看吧。1、构建FTP客户端pac...
    99+
    2023-07-02
  • java多线程批量上传文件的方法是什么
    Java中实现多线程批量上传文件可以通过以下步骤来实现:1. 创建一个线程池,用于管理上传文件的线程。```javaExecutor...
    99+
    2023-09-13
    java
  • Java实现FTP文件上传
    目录一、配置FTP文件服务器 FTP两种模式简介 PORT(主动模式) Passive(被动模式) 1、安装vsftpd 2、配置vsftpd 3、重启启动服务 4、登录二、java...
    99+
    2024-04-02
  • java实现上传文件到FTP
    本文实例为大家分享了java实现上传文件到FTP的具体代码,供大家参考,具体内容如下 需求说明:将指定文件上传到FTP,上传成功后修改文件名。 获取文件名及路径(这里是从数据库获取,...
    99+
    2024-04-02
  • Java如何实现FTP文件上传
    这篇文章给大家分享的是有关Java如何实现FTP文件上传的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、配置FTP文件服务器以Ubuntu为例FTP两种模式简介PORT(主动模式)第一步FTP客户端首先随机选择...
    99+
    2023-06-15
  • java怎么实现上传文件到FTP
    这篇“java怎么实现上传文件到FTP”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“java怎么实现上传文件到FTP”文章吧...
    99+
    2023-07-02
  • 利用java如何实现上传ftp文件
    今天就跟大家聊聊有关利用java如何实现上传ftp文件,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。准备条件:java实现ftp上传用到了commons-net-3.3.jar包首先...
    99+
    2023-05-31
    java ftp上传 ava
  • java实现ftp文件上传下载功能
    本文实例为大家分享了ftp实现文件上传下载的具体代码,供大家参考,具体内容如下package getUrlPic;import java.io.ByteArrayInputStream;import java.io.IOException;...
    99+
    2023-05-31
    ftp 上传 下载
  • Java实现文件上传到ftp服务器
    一、ftp简介 文件传输协议(File Transfer Protocol,FTP)是用于在网络上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和...
    99+
    2023-09-02
    服务器 java 网络
  • Java怎么实现文件压缩与上传FTP
    这篇文章主要介绍“Java怎么实现文件压缩与上传FTP”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java怎么实现文件压缩与上传FTP”文章能帮助大家解决问题。Java文件压缩与上传FTP文件压缩...
    99+
    2023-07-02
  • Java如何实现文件压缩与上传FTP
    目录Java文件压缩与上传FTP文件压缩Ftp下载与上传文件Java程序FTP上传文件依赖架包 commons-net-3.4.jarJava文件压缩与上传FTP 文件压缩 1.po...
    99+
    2024-04-02
  • Java上传下载ftp文件
    在Java中连接FTP服务器可以使用Apache Commons Net库提供的FTPClient类。以下是一个简单的示例代码,演示如何连接到FTP服务器、进行文件上传和下载操作: import org.apache.commons.net...
    99+
    2023-09-03
    java apache 服务器
  • java实现多线程文件的断点续传
    java文件的多线程断点续传大致原理,供大家参考,具体内容如下 谈到文件断点续传那么就离不开java.io.RandomAcessFile HttpUrlConnection类 大致...
    99+
    2024-04-02
  • fastadmin上传文件回调和实现自定义批量上传
    文章目录 前言一、上传回调二、批量上传总结 前言 Fastadmin是基于thinkphp5得一个快速开发开源框架,在市面上很流行,里边自定义了上传文件得方法,只需要简单调用即可使用...
    99+
    2023-09-01
    javascript html php
  • C#怎么实现FTP上传文件
    本文小编为大家详细介绍“C#怎么实现FTP上传文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#怎么实现FTP上传文件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。通过用FTP进行上传文件,首先要实现建立F...
    99+
    2023-06-30
  • springboot集成ftp实现文件上传
    本文实例为大家分享了springboot集成ftp实现文件上传的具体代码,供大家参考,具体内容如下 1、FileUtil package io.renren.modules.os...
    99+
    2024-04-02
  • Java实现多文件上传功能
    文件上传是开发中十分常见的功能,在servlet3.0之前,实现文件上传需要使用一些插件技术,比如: commons-fileupload smartupload ...
    99+
    2024-04-02
  • 微信小程序如何实现ES6Promise.all批量上传文件
    这篇文章主要介绍微信小程序如何实现ES6Promise.all批量上传文件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!微信小程序 ES6Promise.all批量上传文件实现代码客...
    99+
    2024-04-02
  • 微信小程序怎么实现ES6批量上传文件
    这篇文章主要讲解了“微信小程序怎么实现ES6批量上传文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“微信小程序怎么实现ES6批量上传文件”吧!微信小程序 ES6Promise.all批量上...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作