kingchagne的地盘

需要用到 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 Stringhost;private intport;private Stringusername;private Stringpassword;private booleanbinaryTransfer = true;private booleanpassiveMode = true;private Stringencoding= "UTF-8";private intclientTimeout = 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 testingpublic 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:分明是比谁记的都清楚,比谁都更加在意,

kingchagne的地盘

相关文章:

你感兴趣的文章:

标签云: