微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java编写ftp下载工具

本文给大家介绍的是如何一步步实现使用java编写FTP下载工具,而且是在Linux环境下使用javac编译的,在运行和编译上有些不同之处,有需要的小伙伴们参考下吧。

需要用到 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                 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有所帮助。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐