JAVA-使用Commons Net连接FTP

Posted 阿飞的技术博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA-使用Commons Net连接FTP相关的知识,希望对你有一定的参考价值。

使用APACHE下的Commons Net连接FTP

内容出处https://study.163.com/course/courseMain.htm?courseId=1209288803

APACHE官网连接

https://apache.org/

Commons Net下载地址

http://commons.apache.org/

找到Net点进去

 

 http://commons.apache.org/proper/commons-net/

下载地址

http://commons.apache.org/proper/commons-net/download_net.cgi

 

 官方例子

 API帮助

 

 放到项目里的jar包

 项目小例子,源代码

package my;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;

import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.omg.CORBA.portable.InputStream;

public class test
{

    public static void main(String[] args) throws Exception
    {
        // TODO Auto-generated method stub
        FTPClient ftp = new FTPClient();
        
        //连接服务器
        ftp.connect("192.168.1.101", 100);
        
        boolean reply = ftp.isConnected();
        if(!reply)
        {
            System.out.println("** 无法连接至FTP服务器");
            System.exit(1);
        }
        
//        int reply = ftp.getReplyCode();
//        if(!FTPReply.isPositiveCompletion(reply));
//        {
//            ftp.disconnect();
//            System.out.println("** 无法连接至FTP服务器");
//            System.exit(1);
//        }
        
        if(!ftp.login("administrator", "Lu123456"))
        {
            ftp.logout();
            System.out.println("** 错误的用户或密码");
            System.exit(1);
        }
        
        System.out.println("Connected.");
        
        //字节传输BINARY_FILE_TYPE
        //文本传输ASCII_FILE_TYPE
        //一般使用BINARY模式来传输文件,很少使用ASCII_FILE_TYPE
        ftp.setFileType(FTP.BINARY_FILE_TYPE);
        
        //主动模式:enterLocalActiveMode()
        //被动模式:enterLocalPassiveMode()
        //一般选择被动模式
        ftp.enterLocalPassiveMode();
        
        //设置控制通道的字符集,要与服务端的设定一直
        ftp.setControlEncoding("GBK");//用GBK或者UTF-8
        
        //切换目录,设置当前目录(用ftpPath()转换一下)
        boolean rc = ftp.changeWorkingDirectory(ftpPath("/视频"));
        if(!rc)
        {
            System.out.println("切换目录出错!");            
        }
    
        //列出所有的文件/子目录
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("> list");
        FTPFile[] ftpFiles = ftp.listFiles();//查看目录
        for(FTPFile f : ftpFiles)
        {
            String time = sdf.format(f.getTimestamp().getTime());
            String info = "";
            if(f.isDirectory())
                info = String.format("+ %-20s", f.getName());
            else
                info = String.format("  %-20s %8d   %s", f.getName(), f.getSize(), time);
            System.out.println(info);        
        }
        
        
        //创建目录
        ftp.makeDirectory(ftpPath("/音乐"));
        
        //删除目录
        ftp.removeDirectory(ftpPath("/图片"));
        
        //重命名
        ftp.rename(ftpPath("/文档.docx"), ftpPath("/改了名字的文档.docx"));
    
        //上传文件
        File uploadFile = new File("D:/1/2/ABC.docx");
        FileInputStream uploadInStream = new FileInputStream(uploadFile);
        
        String remotePath = ftpPath(uploadFile.getName());
        
        //小文件直接用
        //ftp.storeFile(remotePath, uploadInStream);
        
        //大文件,可以自己掌握进度
        OutputStream uploadOutStream = ftp.storeFileStream(remotePath);
        byte[] uploadBuffer = new byte[4000];
        while(true)
        {
            int n = uploadInStream.read(uploadBuffer);
            if(n <= 0) break;
            
            uploadOutStream.write(uploadBuffer, 0, n);
        }
        uploadInStream.close();
        uploadOutStream.close();
        
//        //下载文件
//        String remptePath = ftpPathGbk("/演示文稿.pptx");//服务器文件路径
//        File localFile = new File("D:/1/2/演示文稿.pptx");//下载到本地的路径
//        localFile.getParentFile().mkdirs();
//        OutputStream outStream = new FileOutputStream(localFile);
//        
//        //小文件直接用
//        //ftp.retrieveFile(remptePath, outStream);
//        
//        //大文件,可以自己掌握进度
//        java.io.InputStream inStream = ftp.retrieveFileStream(remptePath);
//        if(inStream == null)
//            throw new Exception("远程文件不存在!" + remptePath);
//        
//        byte[] buffer = new byte[4000];
//        while(true)
//        {
//            int n = inStream.read(buffer);
//            if(n <= 0) break;
//            
//            outStream.write(buffer, 0, n);
//        }
//        inStream.close();
//        outStream.close();
        

        
        ftp.logout();
        ftp.disconnect();
        System.out.println("Ouit.");
    }

    //API里对中文FTP目录的处理有点问题
    //在调用changeWorkingDirectory() / listFiles()等方法时,将参数路径转换一下
    private static String ftpPath(String path)
    {
        try
        {
            return new String(path.getBytes("GBK"), FTP.DEFAULT_CONTROL_ENCODING);
        }catch(UnsupportedEncodingException e)
        {
            return "";
        }
    }
    
}

演示

 

程序员阿飞

2021年5月22日

 

以上是关于JAVA-使用Commons Net连接FTP的主要内容,如果未能解决你的问题,请参考以下文章

[Java] 使用 Apache的 Commons-net库 实现FTP操作

使用 org.apache.commons.net.ftp.FTPClient 保护 FTP

org.apache.commons.net.MalformedServerReplyException: Could not parse response code. Server Reply: S

org.apache.commons.net.MalformedServerReplyException: Could not parse response code. Server Reply: S

org.apache.commons.net.MalformedServerReplyException: Could not parse response code. Server Reply: S

org.apache.commons.net.MalformedServerReplyException: Could not parse response code. Server Reply: S