简单的FTP客户端 sun.net.ftp.FtpClient
某些数据交换,我们需要通过ftp来完成。
sun.net.ftp.FtpClient 可以帮助我们进行一些简单的ftp客户端功能:下载、上传文件。
但如遇到创建目录之类的就无能为力了,我们只好利用第三方源码,比如 com.enterprisedt.net.ftp.FTPClient
下面写一些sun.net.ftp.FtpClient 的使用方法。
1、引入包
import java.io.DataInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.FileInputStream;import java.util.ArrayList;import java.util.Date;import java.util.List;import sun.net.*;import sun.net.ftp.FtpClient;
?
2、我们建一个叫做FtpUtil的class
/*** connectServer* 连接ftp服务器* @throws java.io.IOException* @param path 文件夹,空代表根目录* @param password 密码* @param user 登陆用户* @param server 服务器地址*/public void connectServer(String server, String user, String password, String path)throws IOException {// server:FTP服务器的IP地址;user:登录FTP服务器的用户名// password:登录FTP服务器的用户名的口令;path:FTP服务器上的路径ftpClient = new FtpClient();ftpClient.openServer(server);ftpClient.login(user, password);//path是ftp服务下主目录的子目录if (path.length() != 0) ftpClient.cd(path);//用2进制上传、下载ftpClient.binary(); }/*** upload* 上传文件* @throws java.lang.Exception* @return -1 文件不存在* -2 文件内容为空 * >0 成功上传,返回文件的大小* @param newname 上传后的新文件名* @param filename 上传的文件*/public long upload(String filename,String newname) throws Exception {long result = 0;TelnetOutputStream os = null;FileInputStream is = null;try { java.io.File file_in = new java.io.File(filename);if (!file_in.exists()) return -1;if (file_in.length()==0) return -2;os = ftpClient.put(newname);result = file_in.length();is = new FileInputStream(file_in);byte[] bytes = new byte[1024];int c;while ((c = is.read(bytes)) != -1) {os.write(bytes, 0, c);}} finally {if (is != null) {is.close();}if (os != null) {os.close();}}return result;}/*** upload* @throws java.lang.Exception* @return * @param filename*/public long upload(String filename)throws Exception {String newname = "";if (filename.indexOf("/")>-1){newname = filename.substring(filename.lastIndexOf("/")+1);}else{newname = filename;}return upload(filename,newname);}/*** download* 从ftp下载文件到本地* @throws java.lang.Exception* @return * @param newfilename 本地生成的文件名* @param filename 服务器上的文件名*/public long download(String filename,String newfilename) throws Exception{ long result = 0;TelnetInputStream is = null;FileOutputStream os = null;try {is = ftpClient.get(filename); java.io.File outfile = new java.io.File(newfilename);os = new FileOutputStream(outfile);byte[] bytes = new byte[1024];int c;while ((c = is.read(bytes)) != -1) {os.write(bytes, 0, c);result = result + c;}} catch (IOException e) {e.printStackTrace();}finally {if (is != null) {is.close();}if (os != null) {os.close();}}return result;}/*** 取得某个目录下的所有文件列表**/public List getFileList(String path){List list = new ArrayList();try {DataInputStream dis = new DataInputStream(ftpClient.nameList(path));String filename = "";while((filename=dis.readLine())!=null) { list.add(filename); } } catch (Exception e) {e.printStackTrace();}return list;}/*** closeServer* 断开与ftp服务器的链接* @throws java.io.IOException*/public void closeServer()throws IOException { try {if (ftpClient != null) {ftpClient.closeServer(); }} catch (IOException e) {e.printStackTrace();}}public static void main(String [] args) throws Exception {FtpUtil ftp = new FtpUtil();try {//连接ftp服务器ftp.connectServer("10.163.7.15", "cxl", "1", "info2");/** 上传文件到 info2 文件夹下 */System.out.println("filesize:"+ftp.upload("f:/download/Install.exe")+"字节");/** 取得info2文件夹下的所有文件列表,并下载到 E盘下 */List list = ftp.getFileList(".");for (int i=0;i<list.size();i++){String filename = (String)list.get(i);System.out.println(filename);ftp.download(filename,"E:/"+filename);}} catch (Exception e) {///}finally{ftp.closeServer();}} }?
?
?
?
?
?
?
?
?
?
?
以下为扩展代码:
?
?
?
?
import java.io.DataInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.FileInputStream; import java.util.ArrayList; import java.util.Date; import java.util.List; import sun.net.*; import sun.net.ftp.FtpClient;//2、我们建一个叫做FtpUtil的classpublic class FtpUtil{//创建ftp服务器FtpClient ftpClient; /** * connectServer * 连接ftp服务器 * @throws java.io.IOException * @param path 文件夹,空代表根目录 * @param password 密码 * @param user 登陆用户 * @param server 服务器地址 */ public void connectServer(String server, String user, String password, String path) throws IOException { // server:FTP服务器的IP地址;user:登录FTP服务器的用户名 // password:登录FTP服务器的用户名的口令;path:FTP服务器上的路径 ftpClient = new FtpClient(); //开启服务 ftpClient.openServer(server); //登录 ftpClient.login(user, password); //path是ftp服务下主目录的子目录 if (path.length() != 0) ftpClient.cd(path); //用2进制上传、下载 ftpClient.binary(); } /** * upload * 上传文件 * @throws java.lang.Exception * @return -1 文件不存在 * -2 文件内容为空 * >0 成功上传,返回文件的大小 * @param newname 上传后的新文件名 * @param filename 上传的文件 */ public long upload(String filename,String newname) throws Exception { long result = 0; //ftp输出流 TelnetOutputStream os = null; FileInputStream is = null; try { java.io.File file_in = new java.io.File(filename); if (!file_in.exists()) return -1; if (file_in.length()==0) return -2; //ftpclient的put方法 调用后将路径传进去 返回TelnetOutputStream 就可以进行文件上传操作了 os = ftpClient.put(newname); result = file_in.length(); is = new FileInputStream(file_in); byte[] bytes = new byte[1024]; int c; while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c); } } finally { if (is != null) { is.close(); } if (os != null) { os.close(); } } return result; } /** * upload * @throws java.lang.Exception * @return * @param filename */ public long upload(String filename) throws Exception { String newname = ""; if (filename.indexOf("/")>-1) { newname = filename.substring(filename.lastIndexOf("/")+1); }else { newname = filename; } return upload(filename,newname); } /** * download * 从ftp下载文件到本地 * @throws java.lang.Exception * @return * @param newfilename 本地生成的文件名 * @param filename 服务器上的文件名 */ public long download(String filename,String newfilename) throws Exception { long result = 0; TelnetInputStream is = null; FileOutputStream os = null; try { is = ftpClient.get(filename); java.io.File outfile = new java.io.File(newfilename); os = new FileOutputStream(outfile); byte[] bytes = new byte[1024]; int c; while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c); result = result + c; } } catch (IOException e) { e.printStackTrace(); } finally { if (is != null) { is.close(); } if (os != null) { os.close(); } } return result; } /** * 取得某个目录下的所有文件列表 * */ public List getFileList(String path) { List list = new ArrayList(); try { DataInputStream dis = new DataInputStream(ftpClient.nameList(path)); String filename = ""; while((filename=dis.readLine())!=null) { list.add(filename); } } catch (Exception e) { e.printStackTrace(); } return list; } /** * closeServer * 断开与ftp服务器的链接 * @throws java.io.IOException */ public void closeServer() throws IOException { try { if (ftpClient != null) { ftpClient.closeServer(); } } catch (IOException e) { e.printStackTrace(); } } public static void main(String [] args) throws Exception { FtpUtil ftp = new FtpUtil(); try { //连接ftp服务器 ftp.connectServer("172.19.11.103", "weblogic", "weblogic", "/home/files"); ftp.createDir("files"); /** 上传文件到 files 文件夹下 */ System.out.println("filesize:"+ftp.upload("f:/download/Install.exe")+"字节"); /** 取得files文件夹下的所有文件列表,并下载到 E盘下 */ List list = ftp.getFileList("."); for (int i=0;i<list.size();i++) { String filename = (String)list.get(i); System.out.println(filename); ftp.download(filename,"E:/"+filename); } } catch (Exception e) { /// }finally { ftp.closeServer(); } } //在ftp服务器上穿件文件夹public boolean createDir(String path) throws Exception{//进入到home文件夹下ftpClient.cd("/home");//创建远程文件夹 //远程命令包括//USER PORT RETR ALLO DELE SITE XMKD CDUP FEAT<br>//PASS PASV STOR REST CWD STAT RMD XCUP OPTS<br>//ACCT TYPE APPE RNFR XCWD HELP XRMD STOU AUTH<br>//REIN STRU SMNT RNTO LIST NOOP PWD SIZE PBSZ<br>//QUIT MODE SYST ABOR NLST MKD XPWD MDTM PROT<br>// 在服务器上执行命令,如果用sendServer来执行远程命令(不能执行本地FTP命令)的话,所有FTP命令都要加上/r/n<br>// ftpclient.sendServer("XMKD /test/bb/r/n"); //执行服务器上的FTP命令<br>// ftpclient.readServerResponse一定要在sendServer后调用<br>// nameList("/test")获取指目录下的文件列表<br>// XMKD建立目录,当目录存在的情况下再次创建目录时报错<br>// XRMD删除目录<br>// DELE删除文件<br>//通过远程命令 穿件一个files文件夹ftpClient.sendServer("MKD "+ path + "/r/n");//这个方法必须在 这两个方法中间调用 否则 命令不管用ftpClient.binary();ftpClient.readServerResponse();return false;}} ?