Java实现FTP上传下载功能
http://lavasoft.blog.51cto.com/62575/93883/
Java FTP客户端工具包很多,在此我选用的Apache的FTPClient。这个包的获取可以通过[url]http://commons.apache.org/net/[/url]来获取,我使用的是最新的commons-net-1.4.1.zip。其中包含了众多的java网络编程的工具包,官方文档列举如下:
支持网络协议如下:
FTP
NNTP
SMTP
POP3
Telnet
TFTP
Finger
Whois
rexec/rcmd/rlogin
Time (rdate) and Daytime
Echo
Discard
NTP/SNTP
支持网络协议如下:
FTP
NNTP
SMTP
POP3
Telnet
TFTP
Finger
Whois
rexec/rcmd/rlogin
Time (rdate) and Daytime
Echo
Discard
NTP/SNTP
都很有用。在此我用到的是FTP相关的一些包。
public class FtpTest { public static void main(String[] args) { testUpload(); testDownload(); } /** * FTP上传单个文件测试 */ public static void testUpload() { FTPClient ftpClient = new FTPClient(); FileInputStream fis = null; try { ftpClient.connect("192.168.14.117"); ftpClient.login("admin", "123"); File srcFile = new File("C:\\new.gif"); fis = new FileInputStream(srcFile); //设置上传目录 ftpClient.changeWorkingDirectory("/admin/pic"); ftpClient.setBufferSize(1024); ftpClient.setControlEncoding("GBK"); //设置文件类型(二进制) ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); ftpClient.storeFile("3.gif", fis); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("FTP客户端出错!", e); } finally { IOUtils.closeQuietly(fis); try { ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("关闭FTP连接发生异常!", e); } } } /** * FTP下载单个文件测试 */ public static void testDownload() { FTPClient ftpClient = new FTPClient(); FileOutputStream fos = null; try { ftpClient.connect("192.168.14.117"); ftpClient.login("admin", "123"); String remoteFileName = "/admin/pic/3.gif"; fos = new FileOutputStream("c:/down.gif"); ftpClient.setBufferSize(1024); //设置文件类型(二进制) ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); ftpClient.retrieveFile(remoteFileName, fos); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("FTP客户端出错!", e); } finally { IOUtils.closeQuietly(fos); try { ftpClient.disconnect(); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("关闭FTP连接发生异常!", e); } } } }
public class Ftp { private static final Logger logger = Logger.getLogger(FTP.class); /** * FTP客户端 */ private FtpClient ftpClient; /** * 服务器连接 * * @param ip * 服务器IP * @param port * 服务器端口 * @param user * 用户名 * @param password * 密码 * @param path * 服务器路径 * @throws IOException * */ public void connectServer(String ip, int port, String user, String password, String path) throws IOException { try { System.out.println("ftp connect..."); ftpClient = new FtpClient(ip); ftpClient.login(user, password); // 设置成2进制传输 ftpClient.binary(); System.out.println("ftp login success!"); if (path.length() != 0) { // 把远程系统上的目录切换到参数path所指定的目录 try { ftpClient.cd(path); } catch (Exception e) { throw new IOException("FTP server: 550 CWD failed 远程目录未响应", e); } } ftpClient.binary(); } catch (IOException e) { logger.error("ftp connect err!"); logger.error(e.getMessage()); e.printStackTrace(); throw new IOException(e.getMessage()); } } /** * 关闭连接 * * */ public void closeConnect() { try { ftpClient.closeServer(); System.out.println("closeConnect success"); } catch (IOException ex) { System.out.println("not closeConnect"); ex.printStackTrace(); throw new RuntimeException(ex); } } /** * 上传文件 * * @param localFile * 本地文件 * @param remoteFile * 远程文件 * */ public void upload(String localFile, String remoteFile) { TelnetOutputStream os = null; FileInputStream is = null; try { // 将远程文件加入输出流中 os = ftpClient.put(remoteFile); // 获取本地文件的输入流 File file_in = new File(localFile); is = new FileInputStream(file_in); // 创建一个缓冲区 byte[] bytes = new byte[1024]; int c; while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c); } System.out.println("upload success"); } catch (IOException ex) { System.out.println("not upload"); ex.printStackTrace(); throw new RuntimeException(ex); } finally { try { if (is != null) { is.close(); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (os != null) { os.close(); } } catch (IOException e) { e.printStackTrace(); } } } } /** * 下载文件 * * @param remoteFile * 远程文件路径(服务器端) * @param localFile * 本地文件路径(客户端) * */ public void download(String remoteFile, String localFile) { TelnetInputStream is = null; FileOutputStream os = null; try { // 获取远程机器上的文件filename,借助TelnetInputStream把该文件传送到本地。 is = ftpClient.get(remoteFile); File file_in = new File(localFile); os = new FileOutputStream(file_in); byte[] bytes = new byte[1024]; int c; while ((c = is.read(bytes)) != -1) { os.write(bytes, 0, c); } System.out.println("download success"); } catch (IOException ex) { System.out.println("not download"); ex.printStackTrace(); throw new RuntimeException(ex); } finally { try { if (is != null) { is.close(); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (os != null) { os.close(); } } catch (IOException e) { e.printStackTrace(); } } } } /** * 返回FTP目录下的文件列表 * * @param ftpDirectory * @return */ public List<String> getFileNameList(String ftpDirectory) { List<String> list = new ArrayList<String>(); BufferedReader bf = null; InputStreamReader isr = null; DataInputStream ds = null; try { ds = new DataInputStream(ftpClient.nameList(ftpDirectory)); isr = new InputStreamReader(ds); bf = new BufferedReader(isr); String filename = ""; while ((filename = bf.readLine()) != null) { list.add(filename); } } catch (Exception e) { e.printStackTrace(); } finally { try { ds.close(); } catch (IOException e) { e.printStackTrace(); } try { isr.close(); } catch (IOException e) { e.printStackTrace(); } try { bf.close(); } catch (IOException e) { e.printStackTrace(); } } return list; } public static void main(String agrs[]) throws Exception { Ftp ftp = new Ftp(); ftp.connectServer("192.168.1.221", 21, "admin", "123@123", "/FTP Files/temp"); List<String> list = ftp.getFileNameList("/FTP Files/temp"); for (String str : list) { try { Calendar cal = Calendar.getInstance();// 使用日历类 int year = cal.get(Calendar.YEAR);// 得到年 int month = cal.get(Calendar.MONTH) + 1;// 得到月,因为从0开始的,所以要加1 int day = cal.get(Calendar.DAY_OF_MONTH);// 得到天 String fileName = "WiMAX_" + year + month + day; System.out.println("str" + str + "---------" + "fileName:" + fileName); String regEx = "WiMAX_\\d{8}_\\d{5}_\\s{5}"; // 表示a或F Pattern pat = Pattern.compile(regEx); System.out.println(pat.matcher(str).find()); // if (str.contains(fileName)) { // fu.download("/FTP Files/temp/" + str, "d:/temp/" + str); // System.out.println("download:" + str); // } } catch (Exception e) { e.printStackTrace(); logger.error(e.getMessage()); throw e; } } ftp.closeConnect(); } }