需要用到 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