java实现ftp连接、登陆、上传、下载、删除文件、获取目录、文件列表
2017-10-12 18:30
1016 查看
全栈工程师开发手册 (作者:栾鹏)
java教程全解
java实现ftp连接、登陆、上传、下载、删除文件、获取目录、文件列表等操作。
本地调试,首先需要在本机上开启ftp服务和ftp站点。
测试代码
ftp工具类的实现
java教程全解
java实现ftp连接、登陆、上传、下载、删除文件、获取目录、文件列表等操作。
本地调试,首先需要在本机上开启ftp服务和ftp站点。
测试代码
public static void main (String args []) throws IOException{ // 标准登陆过程 FtpClient f = new FtpClient("192.168.8.101"); //自动连接 System.out.print("连接响应:"+f.getResponseString()); f.login("luanpeng","123456"); System.out.print("登陆响应:"+f.getResponseString()); f.pwd(); System.out.println("命令:"+f.command); System.out.print("响应:"+f.getResponseString()); f.setPassive(true); // 使用列表 System.out.println("\nDemo of nlist() function"); f.ascii(); // 把客户端设为ASCII模式以获取文本列表 System.out.println("命令:"+f.command); System.out.print("响应:"+f.getResponseString()); BufferedReader t = f.nlist(); // f.list提供了更多的一些细节信息 System.out.println("命令:"+f.command); System.out.print(f.getResponseString()); while( true ) { String stringBuffer = t.readLine(); if( stringBuffer == null ) break; else System.out.println(stringBuffer); } t.close(); System.out.print("响应:"+f.getResponseString()); // 下面使用 getAscii() 函数获取文件. 函数 getBinary() 也类似 System.out.println("\nDemo of getAscii() function"); f.ascii(); // 设置传输模式为ASCII System.out.println("命令:"+f.command); System.out.print("响应:"+f.getResponseString()); BufferedReader bufGet = f.getAscii("welcome.msg"); System.out.println("命令:"+f.command); System.out.print(f.getResponseString()); PrintWriter pOut = new PrintWriter(new BufferedWriter(new FileWriter("welcome.msg"))); int i; char c[] = new char[4096]; while ((i = bufGet.read(c)) != -1) pOut.write(c,0,i); bufGet.close(); pOut.close(); System.out.print("响应:"+f.getResponseString()); // 下面使用appendAscii()函数添加一个文件,appendBinary()函数的使用类似 System.out.println("\nDemo of appendAscii() function"); BufferedWriter bufAppe; String localFile = "file name goes here"; f.ascii(); System.out.println("命令:"+f.command); try { bufAppe = f.appendAscii(localFile); System.out.println("命令:"+f.command); System.out.print("响应:"+f.getResponseString()); FileReader fIn = new FileReader(localFile); BufferedReader bufIn = new BufferedReader(fIn); int k; char b[] = new char[1024]; while ((k = bufIn.read(b)) != -1) bufAppe.write(b,0,k); bufIn.close(); bufAppe.flush(); bufAppe.close(); }catch(Exception appendErr) { System.out.println(appendErr.toString());//printStackTrace(); } System.out.print("响应:"+f.getResponseString()); // 下面使用putBianary()函数发送一个二进制文件,函数putAscii()类似 System.out.println("\nDemo of putBinary() function"); String localFile2 = "file name goes here"; f.binary(); System.out.println("命令:"+f.command); BufferedOutputStream bufPut = f.putBinary(localFile2); System.out.println("命令:"+f.command); System.out.print("响应:"+f.getResponseString()); BufferedInputStream bufIn = new BufferedInputStream(new FileInputStream(localFile2)); int j; byte b[] = new byte[1024]; while ((j = bufIn.read(b)) != -1) bufPut.write(b,0,j); bufIn.close(); bufPut.flush(); bufPut.close(); System.out.print("响应:"+f.getResponseString()); // 关闭连接 f.closeServer(); System.out.println("命令:"+f.command); System.out.print("响应:"+f.getResponseString()); }
ftp工具类的实现
package com.lp.app.net; import java.net.*; import java.io.*; import java.util.*; class FtpClient { static final boolean debug = false; public static final int FTP_PORT = 21; // ftp的端口 static int FTP_SUCCESS = 1; static int FTP_TRY_AGAIN = 2; static int FTP_ERROR = 3; // 数据传输套接字 private Socket dataSocket = null; private boolean replyPending = false; private boolean binaryMode = false; //用HTML 和文本编写的文件必须用ASCII模式上传,BINARY模式用来传送可执行文件,压缩文件,和图片文件。 private boolean passiveMode = false; //被动模式 String user = null; // 登录用的用户名 String password = null; // 登录用的密码 String command; // 最近一次命令 int lastReplyCode; // 最近的响应信息 public String welcomeMsg; // 服务器的欢迎信息 // 从服务器返回的响应字符串对象 protected Vector serverResponse = new Vector(1); protected Socket serverSocket = null; // 与服务器通信的套接字 public PrintWriter serverOutput; //向服务器发送命令的输出流 public InputStream serverInput; // 从服务器读取响应的缓冲流 /** 返回服务器连接的状态 */ public boolean serverIsOpen() { return serverSocket != null; } /** 设置为被动模式 */ public void setPassive(boolean mode) { passiveMode = mode; } /** 读取服务器的响应信息 */ public int readServerResponse() throws IOException { StringBuffer replyBuf = new StringBuffer(32); int c; int continuingCode = -1; int code = -1; String response; if (debug) System.out.println("readServerResponse start"); try{ while (true) { if (debug) System.out.println("readServerResponse outer while loop: "+ serverInput.available()); while ((c = serverInput.read()) != -1) { if (c == '\r') { if ((c = serverInput.read()) != '\n') replyBuf.append('\r'); } replyBuf.append((char)c); if (c == '\n') break; } if (debug) System.out.println("Now past inner while loop"); response = replyBuf.toString(); replyBuf.setLength(0); if (debug) { System.out.print(response); } try { code = Integer.parseInt(response.substring(0, 3)); } catch (NumberFormatException e) { code = -1; } catch (StringIndexOutOfBoundsException e) { // 此行不存在响应码,循环跳到下一次 continue; } serverResponse.addElement(response); if (continuingCode != -1) { /* we've seen a XXX- sequence */ if (code != continuingCode || (response.length() >= 4 && response.charAt(3) == '-')) { continue; } else { continuingCode = -1; // 到达程序的结尾 break; } } else if (response.length() >= 4 && response.charAt(3) == '-') { continuingCode = code; continue; } else { break; } } }catch(Exception e){e.printStackTrace();} if (debug) System.out.println("readServerResponse done"); return lastReplyCode = code; } /** 发送命令cmd给服务器 */ public void sendServer(String cmd) { if (debug) System.out.println("sendServer start"); serverOutput.println(cmd); if (debug) System.out.println("sendServer done"); } /** 返回服务器的所有响应字符串 */ public String getResponseString() { String s = new String(); for(int i = 0;i < serverResponse.size();i++) { s+=serverResponse.elementAt(i); } serverResponse = new Vector(1); return s; } /** 获取响应字符串 */ public String getResponseStringNoReset() { String s = new String(); for(int i = 0;i < serverResponse.size();i++) { s+=serverResponse.elementAt(i); } return s; } /** 发送 QUIT 命令给服务器并关闭连接 */ public void closeServer() throws IOException { if (serverIsOpen()) { issueCommand("QUIT"); if (! serverIsOpen()) { return; } serverSocket.close(); serverSocket = null; serverInput = null; serverOutput = null; } } protected int issueCommand(String cmd) throws IOException { command = cmd; int reply; if (debug) System.out.println(cmd); if (replyPending) { if (debug) System.out.println("replyPending"); if (readReply() == FTP_ERROR) System.out.print("Error reading pending reply\n"); } replyPending = false; do { sendServer(cmd); reply = readReply(); if (debug) System.out.println("in while loop of issueCommand method"); } while (reply == FTP_TRY_AGAIN); return reply; } // 检测命令 protected void issueCommandCheck(String cmd) throws IOException { if (debug) System.out.println("issueCommandCheck"); if (issueCommand(cmd) != FTP_SUCCESS) { throw new FtpProtocolException(cmd); } } /** 读取返回数据 */ protected int readReply() throws IOException { lastReplyCode = readServerResponse(); switch (lastReplyCode / 100) { case 1: replyPending = true; case 2:// 这个case用来以后扩展功能 case 3: return FTP_SUCCESS; case 5: if (lastReplyCode == 530) { if (user == null) { throw new FtpLoginException("Not logged in"); } return FTP_ERROR; } if (lastReplyCode == 550) { if (!command.startsWith("PASS")) throw new FileNotFoundException(command); else throw new FtpLoginException("Error: Wrong Password!"); } } return FTP_ERROR; } // 打开数据连接 protected Socket openDataConnection(String cmd) throws IOException { ServerSocket portSocket = null; String portCmd; InetAddress myAddress = InetAddress.getLocalHost(); byte addr[] = myAddress.getAddress(); int shift; String ipaddress; int port = 0; IOException e; if (this.passiveMode) { // 首先尝试被动模式传输 try { getResponseString(); if (issueCommand("PASV") == FTP_ERROR) { e = new FtpProtocolException("PASV"); throw e; } String reply = getResponseStringNoReset(); reply = reply.substring(reply.lastIndexOf("(") + 1, reply .lastIndexOf(")")); StringTokenizer st = new StringTokenizer(reply, ","); String[] nums = new String[6]; int i = 0; while (st.hasMoreElements()) { try { nums[i] = st.nextToken(); i++; } catch (Exception a) { a.printStackTrace(); } } ipaddress = nums[0] + "." + nums[1] + "." + nums[2] + "." + nums[3]; try { int firstbits = Integer.parseInt(nums[4]) << 8; int lastbits = Integer.parseInt(nums[5]); port = firstbits + lastbits; } catch (Exception b) { b.printStackTrace(); } if ((ipaddress != null) && (port != 0)) { dataSocket = new Socket(ipaddress, port); } else { e = new FtpProtocolException("PASV"); throw e; } if (issueCommand(cmd) == FTP_ERROR) { e = new FtpProtocolException(cmd); throw e; } } catch (FtpProtocolException fpe) { portCmd = "PORT "; // 附加host地址 for (int i = 0; i < addr.length; i++) { portCmd = portCmd + (addr[i] & 0xFF) + ","; } try { portSocket = new ServerSocket(20000); // 附加端口 portCmd = portCmd + ((portSocket.getLocalPort() >>> 8) & 0xff) + "," + (portSocket.getLocalPort() & 0xff); if (issueCommand(portCmd) == FTP_ERROR) { e = new FtpProtocolException("PORT"); throw e; } if (issueCommand(cmd) == FTP_ERROR) { e = new FtpProtocolException(cmd); throw e; } dataSocket = portSocket.accept(); } finally { if (portSocket != null) portSocket.close(); } dataSocket = portSocket.accept(); portSocket.close(); } } else { // 端口传送 portCmd = "PORT "; // 附加host地址 for (int i = 0; i < addr.length; i++) { portCmd = portCmd + (addr[i] & 0xFF) + ","; } try { portSocket = new ServerSocket(20000); // 附加端口号 portCmd = portCmd + ((portSocket.getLocalPort() >>> 8) & 0xff) + "," + (portSocket.getLocalPort() & 0xff); if (issueCommand(portCmd) == FTP_ERROR) { e = new FtpProtocolException("PORT"); throw e; } if (issueCommand(cmd) == FTP_ERROR) { e = new FtpProtocolException(cmd); throw e; } dataSocket = portSocket.accept(); } finally { if (portSocket != null) portSocket.close(); } dataSocket = portSocket.accept(); portSocket.close(); } return dataSocket; } /** 打开一个到host的FTP连接 */ public void openServer(String host) throws IOException, UnknownHostException { int port = FTP_PORT; if (serverSocket != null) closeServer(); serverSocket = new Socket(host, FTP_PORT); serverOutput = new PrintWriter(new BufferedOutputStream(serverSocket.getOutputStream()),true); serverInput = new BufferedInputStream(serverSocket.getInputStream()); } /** 打开到 host端口为port的FTP连接 */ public void openServer(String host, int port) throws IOException, UnknownHostException { if (serverSocket != null) closeServer(); serverSocket = new Socket(host, port); serverOutput = new PrintWriter(new BufferedOutputStream(serverSocket.getOutputStream()),true); serverInput = new BufferedInputStream(serverSocket.getInputStream()); if (readReply() == FTP_ERROR) throw new FtpConnectException("Welcome message"); } /** 使用用户名user和密码password登录*/ public void login(String user, String password) throws IOException { if (!serverIsOpen()) throw new FtpLoginException("Error: not connected to host.\n"); this.user = user; this.password = password; if (issueCommand("USER " + user) == FTP_ERROR) throw new FtpLoginException("Error: User not found.\n"); if (password != null && issueCommand("PASS " + password) == FTP_ERROR) throw new FtpLoginException("Error: Wrong Password.\n"); } /** 只用用户名user不用密码登录 */ public void login(String user) throws IOException { if (!serverIsOpen()) throw new FtpLoginException("not connected to host"); this.user = user; if (issueCommand("USER " + user) == FTP_ERROR) throw new FtpLoginException("Error: Invalid Username.\n"); } /** 以Ascii 模式从FTP server获取一个文件 */ public BufferedReader getAscii(String filename) throws IOException { Socket s = null; try { s = openDataConnection("RETR " + filename); } catch (FileNotFoundException fileException) {fileException.printStackTrace();} return new BufferedReader( new InputStreamReader(s.getInputStream())); } /** 以Binary 模式从FTP server获取一个文件 */ public BufferedInputStream getBinary(String filename) throws IOException { Socket s = null; try { s = openDataConnection("RETR " + filename); } catch (FileNotFoundException fileException) {fileException.printStackTrace();} return new BufferedInputStream(s.getInputStream()); } /** 以Ascii 模式发送一个文件 */ public BufferedWriter putAscii(String filename) throws IOException { Socket s = openDataConnection("STOR " + filename); return new BufferedWriter(new OutputStreamWriter(s.getOutputStream()),4096); } /** 以Binary 模式向server发送一个文件 */ public BufferedOutputStream putBinary(String filename) throws IOException { Socket s = openDataConnection("STOR " + filename); return new BufferedOutputStream(s.getOutputStream()); } /** 以Ascii 模式在server上创建或添加一个文件 */ public BufferedWriter appendAscii(String filename) throws IOException { Socket s = openDataConnection("APPE " + filename); return new BufferedWriter(new OutputStreamWriter(s.getOutputStream()),4096); } /** 以Binary 模式在server上创建或添加一个文件 */ public BufferedOutputStream appendBinary(String filename) throws IOException { Socket s = openDataConnection("APPE " + filename); return new BufferedOutputStream(s.getOutputStream()); } /** NLIST 文件在远端 FTP server */ public BufferedReader nlist() throws IOException { Socket s = openDataConnection("NLST"); return new BufferedReader( new InputStreamReader(s.getInputStream())); } /** LIST files 在远端 FTP server */ public BufferedReader list() throws IOException { Socket s = openDataConnection("LIST"); return new BufferedReader( new InputStreamReader(s.getInputStream())); } /** 在FTP server上改变文件路径 */ public void cd(String remoteDirectory) throws IOException { issueCommandCheck("CWD " + remoteDirectory); } /** 在server上改变文件名 */ public void rename(String oldFile, String newFile) throws IOException { issueCommandCheck("RNFR " + oldFile); issueCommandCheck("RNTO " + newFile); } /** Site 命令 */ public void site(String params) throws IOException { issueCommandCheck("SITE "+ params); } /** 设置为'I'传输模式 */ public void binary() throws IOException { issueCommandCheck("TYPE I"); binaryMode = true; } /** 设置为'A'传输模式 */ public void ascii() throws IOException { issueCommandCheck("TYPE A"); binaryMode = false; } /** 发送Abort 命令 */ public void abort() throws IOException { issueCommandCheck("ABOR"); } /** 在远端系统浏览上一级目录 */ public void cdup() throws IOException { issueCommandCheck("CDUP"); } /** 在远端系统中创建一个目录 */ public void mkdir(String s) throws IOException { issueCommandCheck("MKD " + s); } /** 在远端系统中删除某个路径 */ public void rmdir(String s) throws IOException { issueCommandCheck("RMD " + s); } /** 删除文件 */ public void delete(String s) throws IOException { issueCommandCheck("DELE " + s); } /** 获取当前目录名 */ public void pwd() throws IOException { issueCommandCheck("PWD"); } /** 获取远端系统的信息 */ public void syst() throws IOException { issueCommandCheck("SYST"); } /** 新的FTP客户端连接到host <i>host</i>. */ public FtpClient(String host) throws IOException { openServer(host, FTP_PORT); } /** 新的FTP客户端连接到host <i>host</i>, port <i>port</i>. */ public FtpClient(String host, int port) throws IOException { openServer(host, port); } } class FtpLoginException extends FtpProtocolException { FtpLoginException(String s) { super(s); } } class FtpConnectException extends FtpProtocolException { FtpConnectException(String s) { super(s); } } class FtpProtocolException extends IOException { FtpProtocolException(String s) { super(s); } }
相关文章推荐
- C#实现Ftp各种操作(上传,下载,删除文件,创建目录,删除目录,获得文件列表)
- 使用.net FtpWebRequest 实现FTP常用功能 上传 下载 获取文件列表 移动 切换目录 改名 .
- C#FTP操作类含下载上传删除获取目录文件及子目录列表等等
- 使用.net FtpWebRequest 实现FTP常用功能 上传 下载 获取文件列表 移动 切换目录 改名
- Java实现FTP服务器的上传、下载、删除、查看文件列表
- java 两个通过java代码操作FTP的类,上传下载删除,获取文件
- .net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表等
- .net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表等
- .net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表等
- net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表等
- .net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表
- php下连接ftp实现文件的上传、下载、删除文件实例代码
- .net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表等
- .net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表等
- java操作FTP,实现文件上传下载删除操作
- net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表
- .net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表等(转)
- .net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表等 收藏
- [导入].net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表等
- .net,C#,Ftp各种操作,上传,下载,删除文件,创建目录,删除目录,获得文件列表等