当前位置: 首页 > 编程笔记 >

java编写ftp下载工具

宰父玄天
2023-03-14
本文向大家介绍java编写ftp下载工具,包括了java编写ftp下载工具的使用技巧和注意事项,需要的朋友参考一下

需要用到 java 写一个 ftp 的工具,因为只有一点点 java 基础,但是由于好几年不用,几乎算是不会了,只好一点点来搞,还好能捡起来。

不过因为是在 Linux 下使用 javac 编译,不是在 WIN 下使用 IDE 来做这些事情,所以在运行和编译上又费了一些时间,不过正是因为这样对 JAVA 的一些编译、运行的知识又了解了一些。

对于 ftp 下载工具,代码如下:


import java.io.File;   

import java.io.FileInputStream;   

import java.io.FileNotFoundException;   

import java.io.FileOutputStream;   

import java.io.IOException;   

import java.io.InputStream;   

import java.io.OutputStream;   

import java.net.SocketException;   

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

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

public class FtpClient {

    private String         host;   

    private int            port;   

    private String         username;   

    private String         password;   

    private boolean        binaryTransfer = true;   

    private boolean        passiveMode    = true;   

    private String         encoding       = "UTF-8";   

    private int            clientTimeout  = 3000;   

    private boolean flag=true;

    private FTPClient ftpClient = null;

    public String getHost() {   

        return host;   

    }   

    public void setHost(String host) {   

        this.host = host;   

    }   

    public int getPort() {   

        return port;   

    }   

    public void setPort(int port) {   

        this.port = port;   

    }   

    public String getUsername() {   

        return username;   

    }   

    public void setUsername(String username) {   

        this.username = username;   

    }   

    public String getPassword() {   

        return password;   

    }   

    public void setPassword(String password) {   

        this.password = password;   

    }   

    public boolean isBinaryTransfer() {   

        return binaryTransfer;   

    }   

    public void setBinaryTransfer(boolean binaryTransfer) {   

        this.binaryTransfer = binaryTransfer;   

    }   

    public boolean isPassiveMode() {   

        return passiveMode;   

    }   

    public void setPassiveMode(boolean passiveMode) {   

        this.passiveMode = passiveMode;   

    }   

    public String getEncoding() {   

        return encoding;   

    }   

    public void setEncoding(String encoding) {   

        this.encoding = encoding;   

    }   

    public int getClientTimeout() {   

        return clientTimeout;   

    }   

    public void setClientTimeout(int clientTimeout) {   

        this.clientTimeout = clientTimeout;   

    }   

    public FtpClient(String Host) {

        this.username = "anonymous";

        this.encoding = "utf-8";

        this.binaryTransfer = true;

        this.binaryTransfer = true;

        this.port = 21;

        this.host = Host;

        try {

            this.ftpClient = getFTPClient();

        } catch (Exception e) {

            System.out.println("Create FTPClient error!");

        }

    }

    private FTPClient getFTPClient() throws IOException {   

        FTPClient ftpClient = new FTPClient(); 

        ftpClient.setControlEncoding(encoding);

        connect(ftpClient);

        if (passiveMode) {   

            ftpClient.enterLocalPassiveMode();   

        }   

        setFileType(ftpClient); 

        try {   

            ftpClient.setSoTimeout(clientTimeout);   

        } catch (SocketException e) {   

            throw new IOException("Set timeout error.", e);   

        }   

        return ftpClient;   

    }   

    private void setFileType(FTPClient ftpClient) throws IOException {   

        try {   

            if (binaryTransfer) {   

                ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);   

            } else {   

                ftpClient.setFileType(FTPClient.ASCII_FILE_TYPE);   

            }   

        } catch (IOException e) {   

            throw new IOException("Could not to set file type.", e);   

        }   

    }   

    public boolean connect(FTPClient ftpClient) throws IOException {   

        try {   

            ftpClient.connect(host, port);   

            int reply = ftpClient.getReplyCode();   

            if (FTPReply.isPositiveCompletion(reply)) {   

                if (ftpClient.login(username, password)) {   

                    setFileType(ftpClient);   

                    return true;   

                }   

            } else {   

                this.ftpClient.disconnect();   

                throw new IOException("FTP server refused connection.");   

            }   

        } catch (IOException e) {   

            if (this.ftpClient.isConnected()) {   

                try {   

                    this.ftpClient.disconnect();

                } catch (IOException e1) {   

                    throw new IOException("Could not disconnect from server.", e);   

                }   

            }   

            throw new IOException("Could not connect to server.", e);   

        }   

        return false;   

    }   

    private void disconnect() throws IOException {   

        try {   

            this.ftpClient.logout();   

        } catch (IOException e) {   

            System.out.println("logout may timeout!");

        } finally {

            if (this.ftpClient.isConnected()) {   

                this.ftpClient.disconnect();   

            }   

        }  

    }   

    public InputStream getStream(String serverFile) throws IOException {

        InputStream inStream = null;

        try {

            inStream = this.ftpClient.retrieveFileStream(serverFile);

            System.out.println("inStream get over!");

            return inStream;

        } catch (IOException e) {

            System.out.println("get stream exception");

            return null;

        }

    }

    public boolean writeStream(InputStream input, String localFile) throws IOException {

        FileOutputStream fout = new FileOutputStream(localFile);

        int ch = 0;

        if(input == null){

            System.out.println("input is null");

            return false;

        }

        try {

            ch = input.read();

            while(ch != -1){

                fout.write(ch);

                ch = input.read();

            }

            System.out.println("write over!");

            return flag;

        } catch (IOException e) {

            throw new IOException("Couldn't get file from server.", e);

        } 

    }

    public boolean isExist(String remoteFilePath)throws IOException{

        try{

            File file=new File(remoteFilePath);

            String remotePath=remoteFilePath.substring(0,(remoteFilePath.indexOf(file.getName())-1));

            String[] listNames = this.ftpClient.listNames(remotePath);   

            System.out.println(remoteFilePath);

            for(int i=0;i<listNames.length;i++){

                System.out.println(listNames[i]);

                if(remoteFilePath.equals(listNames[i])){

                    flag=true;

                    System.out.println("file:"+file.getName()+" existed");

                    break;

                }else {

                    flag=false;

                }

            }

        } catch (IOException e) {   

            throw new IOException("FILE EXCEPTION", e);   

        } 

        return flag;

    }

    //main for testing

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

        String hostname = "cp01-testing-ps7130.cp01.baidu.com";

        String serverFile="/home/work/check_disk.sh";

        String localFile="/home/work/workspace/project/dhc2-0/dhc/base/ftp/task_get";

        FtpClient ftp = new FtpClient(hostname);   

        System.out.println(ftp.isExist(serverFile));

        ftp.writeStream(ftp.getStream(serverFile), localFile);

        ftp.disconnect();

    }   

}

这个工具是为了配合另外一个 Hadoop 工具做 集群上传用的,所以里面的把 input 和 output 流分开了,也是为了方便另外一个工具使用。

补充一点,如何在 linux 配置运行:

如果这样的代码需要在 linux 下环境运行,首先要配置好响应的包,例如


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

这个包在 apache 的网站上直接下载就行,解压后找到对应的 jar 包,在编译的时候进行引用:


export FTPPATH="${路径}/xxx.jar"

javac -classpath $CLASSPATH:$FTPPATH FtpClient.java

同样,在运行的时候也要指定 classpath:


java -classpath $CLASSPATH:$FTPPATH FtpClient

建议不要把$FTPPATH 包含在 CLASSPATH 中,用什么包就引用什么环境变量就行了,没必要一股脑都添加进去,就像我们没必要 import 所有的包一样。

以上所述就是本文的全部内容了,希望能够对大家学习java有所帮助。

请您花一点时间将文章分享给您的朋友或者留下评论。我们将会由衷感谢您的支持!

 类似资料:
  • 本文向大家介绍java编写Http服务器下载工具,包括了java编写Http服务器下载工具的使用技巧和注意事项,需要的朋友参考一下 这个工具比较简单,用于配合另外一个工具进行文件传送,废话少说,上代码 这个工具实现了从HTTP服务器上下载指定行数的文件,并且不会因为编码的问题引起下载的文件内容乱码 三个工具已经搞定,下一次就是把这三个工具结合起来将HTTP、FTP的文件转移到HDFS上 hadoo

  • 问题内容: 我正在尝试编写一个代码,以在我的独立服务器上打开FTP服务器,以便可以将文件从FTP服务器复制到另一台计算机上的客户端,反之亦然。 我得到了Apache FtpServer,但对其使用感到有些困惑,并且正在寻找使用它的基本步骤。也许像这样: 做连接命令 登录 做一些事情… 问题答案: 让我使用非常有用的 Apache FtpServer 为您编写一个基本示例: 请注意,在服务器端,您不

  • 我有这个代码来下载一个文件。 这是服务器和密码的一部分。 简单的填充下载,但此行出错 它给了我错误,我希望你能理解我现在面临的问题 java.net.SocketExc0019:软件导致连接中止:套接字写入错误在java.net.SocketOutputStream.socketWrite0(本地方法)在java.net.SocketOutputStream.socket写入(SocketOutp

  • 我试图递归地遍历登录到FTP服务器后到达的整个根目录。 我能够连接,我真正想做的就是递归整个结构,下载每个文件和文件夹,并使其与FTP上的结构相同。到目前为止,我拥有的是一种有效的下载方法,它进入服务器并获取我的整个文件结构,这非常棒,只是第一次尝试失败,然后第二次成功。我得到的错误如下: java.io.FileNotFoundException: outout-目录\test\testFile

  • 我有以下问题:出于测试目的,我使用FTP服务器作为存储库。部署(上传)不同的工件都可以正常工作。一旦我需要解析和下载之前上传到该存储库的工件依赖项,我就会收到以下警告: [WARN]myrepo(ftp://ftp.myftpadress.fr/dev/M2Repo/,发布快照)被忽略(仅支持S3、HTTP/S和FILE)。 我无法使用HTTP协议访问存储库。那么货车是否支持FTP协议来下载所需的

  • 问题内容: 我试图递归遍历登录FTP服务器后到达的整个根目录。 我能够连接,我真正想要做的就是遍历整个结构,然后下载每个文件和文件夹,并使其具有与FTP相同的结构。到目前为止,我所能提供的是一种有效的下载方法,它可以到达服务器并获取我的整个文件结构,这很不错,只是第一次尝试失败,然后第二次尝试成功。我得到的错误如下: java.io.FileNotFoundException:输出目录\ test