用FtpClient实现文件下载(全目录不只是文件夹)

原文:https://blog.csdn.net/java2000_net/article/details/3718852

需要用到的jar是

commons-net

commons-net

3.6

具体代码如下

package com.utils;

import org.apache.commons.net.ftp.FTPClient;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.FileOutputStream;

import java.io.OutputStream;

import javax.swing.JFileChooser;

import javax.swing.SwingUtilities;

import javax.swing.UIManager;

/**

* @Author: YafengLiang

* @Description:

* @Date: Created in 16:40 2018/12/5

*/

public class FtpTest {

private static final Logger logger = LoggerFactory.getLogger(FtpTest.class);

static FTPClient ftpClient;

final static String HOST="192.168.6.88";

final static int PORT=21;

final static String USERNAME="user1";

final static String PASSWORD="voicecyber@123";

final static String LOCAL_DIRECTORY="F:/voicecyber/";

public static void login() throws IOException{

ftpClient = new FTPClient();

ftpClient.connect(HOST,PORT);

ftpClient.login(USERNAME, PASSWORD);

//设置编码

ftpClient.setControlEncoding("GBK");

ftpClient.setBufferSize(8096);

}

/**

* 判断给定的路径是文件还是文件夹

* @param path

* @return

* @throws IOException

*/

public static boolean isDirectory(String path) throws IOException{

//如果是文件,就会返回false

//如果文件夹或文件名中含有中文,这里要转换一下,不然会返回false

return ftpClient.changeWorkingDirectory(new String(path.getBytes(),"ISO-8859-1"));

}

/**

* 判断本地路径是否存在,不存在就创建路径

* @param path

*/

public static void makeDirs(String path){

File localFile = new File(LOCAL_DIRECTORY+path);

if(!localFile.exists()){

localFile.mkdirs();

}

}

/**

* 下载单个文件

* @param dir

* @throws IOException

*/

public static void downloadFile(String dir) throws IOException{

File file = new File(LOCAL_DIRECTORY + dir);

OutputStream os = new FileOutputStream(file);

ftpClient.setControlEncoding("GBK");

ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

//如果文件名中含有中文,retrieveFile文件时会找不到FTP上的文件,导致保存在本地的是一个空文件,所以也要转换一下

ftpClient.retrieveFile(new String(file.getName().getBytes(),"ISO-8859-1"), os);

os.close();

}

/**

* 下载任务,递归调用,循环下载所有目录下的文件

* @param path

* @throws IOException

*/

public static void doDownload(String path) throws IOException{

//创建本地目录

makeDirs(path);

//切换工作目录

ftpClient.changeWorkingDirectory(new String(path.getBytes(),"ISO-8859-1"));

//获取目录下的文件列表

String[] fileNames = ftpClient.listNames();

//循环下载FTP目录下的文件

for(String fname:fileNames){

if(isDirectory(path+"/"+fname)){

//递归调用

doDownload(path+"/"+fname);

}else{

//下载单个文件

downloadFile(path+"/"+fname);

}

}

}

/**

* 实时同步ftp目录文件到本地

*/

public static class MyRun implements Runnable{

@Override

public void run() {

while(true){

try {

Thread.sleep(10*1000);

logger.info("休息十秒。。。。。。");

doDownload("/");

} catch (InterruptedException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

public static void main(String[] args) throws IOException {

//连接FTP服务器

login();

//全目录下载

MyRun myRun = new MyRun();

new Thread(myRun).start();

//testUpload();

}

/**

* ftp上传

*/

public static void testUpload() {

FTPClient ftpClient = new FTPClient();

FileInputStream fis = null;

try {

ftpClient.connect("172.20.16.76",9500);

ftpClient.login("lyc", "123456");

JFileChooser fd = new JFileChooser();

try {

UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");

}

catch (Exception e) {

e.printStackTrace();

}

SwingUtilities.updateComponentTreeUI(fd);

fd.showOpenDialog(null);

File srcFile = fd.getSelectedFile();

//if(srcFile != null){}

fis = new FileInputStream(srcFile);

//设置上传目录

ftpClient.changeWorkingDirectory("/img");

//ftpClient.setBufferSize(1024);

ftpClient.setControlEncoding("GBK");

//设置文件类型(二进制)

ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);

ftpClient.storeFile(srcFile.getName(), fis);

} catch (IOException e) {

e.printStackTrace();

throw new RuntimeException("FTP客户端出错!", e);

} finally {

try {

ftpClient.disconnect();

} catch (IOException e) {

e.printStackTrace();

throw new RuntimeException("关闭FTP连接发生异常!", e);

}

}

}

}


AE的所有常用快捷键大全
内维尔:阿森纳所有边后卫都比利物浦强,廷伯是最好的那个