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有所帮助。 请您花一点时间将文章分享给您的朋友或者留下评论。我们将会由衷感谢您的支持! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |