java連接FTP服務(wù)器圖文教程
這一期,我們來學(xué)習(xí)一下如何用Java連接FTP服務(wù)器。在工程項(xiàng)目中,我們往往需要連接FTP服務(wù)器。當(dāng)我們有此需求時(shí),可以從兩個(gè)方面考慮。第一,根據(jù)FTP協(xié)議自己寫出一套程序,這是一種思路,當(dāng)然這是一件很費(fèi)時(shí)又耗成本的一件事。我們是工程師,我們的目的是把需求實(shí)現(xiàn),而不是科研項(xiàng)目。所以得考慮另一種思路,去尋找已經(jīng)做好的API。好巧,剛好有一個(gè)開源組織為我們做好了這個(gè)API,那就是偉大的Apache。下面就開始時(shí)根據(jù)Apache給我們提供的API完成我們的需求。
第一步,下載jar包,登錄官網(wǎng)如下:
然后找到“Projects”點(diǎn)進(jìn)去,出現(xiàn)下拉框。點(diǎn)擊“Project List”
找到Commons點(diǎn)進(jìn)去
往下滑,找到“net”
點(diǎn)進(jìn)去,然后在左上角找到“download”
點(diǎn)擊然后往下滑,找到如圖
其中Binaries是編譯后的jar,Source是源代碼。一般使用的是編譯后的jar,將其下載,下載之后就是新建項(xiàng)目導(dǎo)jar包。如何導(dǎo)jar,不會(huì)再這里說。此時(shí),我們jar已經(jīng)準(zhǔn)備好。我們還需要一個(gè)ftp服務(wù)器,如何建立ftp服務(wù)器也不會(huì)再這里說。
現(xiàn)在假設(shè)你已經(jīng)創(chuàng)建好項(xiàng)目,已經(jīng)建立好ftp服務(wù)器,下面就直接上代碼了。
package my; 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.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply; public class TestFTPClient { // API里對(duì)中文FTP目錄的處理有點(diǎn)問題 // 在調(diào)用 changeWorkingDirectory() / listFiles()等方法時(shí),將參數(shù)路徑轉(zhuǎn)換一下 public static String ftpPath(String path) { try { return new String(path.getBytes("UTF-8"), FTP.DEFAULT_CONTROL_ENCODING); } catch (UnsupportedEncodingException e) { return ""; } } public static void main(String[] args) throws Exception { FTPClient ftp = new FTPClient(); // 連接服務(wù)器 ftp.connect("127.0.0.1", 21); int reply = ftp.getReplyCode(); if (!FTPReply.isPositiveCompletion(reply)) { ftp.disconnect(); System.out.println("** 無法連接至FTP服務(wù)器!"); System.exit(1); } if (!ftp.login("test", "123456")) { ftp.logout(); System.out.println("** 錯(cuò)誤的用戶名或密碼!"); System.exit(1); } System.out.println("Connected."); // 字節(jié)傳輸 BINARY_FILE_TYPE // 文本傳輸 ASCII_FILE_TYPE // 一般使用BINARY模式來傳輸文件,很少使用 ASCII_FILE_TYPE ftp.setFileType(FTP.BINARY_FILE_TYPE); // 主動(dòng)模式: enterLocalActiveMode() // 被動(dòng)模式: enterLocalPassiveMode() // 一般選擇被動(dòng)模式 ftp.enterLocalPassiveMode(); // 設(shè)置控制通道的字符集, 要與服務(wù)端的設(shè)定一致 ftp.setControlEncoding("UTF-8"); // 切換目錄 ( 用ftpPath() 轉(zhuǎn)換一下 ) // boolean rc = ftp.changeWorkingDirectory(ftpPath("/圖片")); // if(!rc) // { // System.out.println("切換目錄出錯(cuò)!"); // } // ... // // 列出所有的文件/子目錄 // listFile(ftp); //上傳一個(gè)文件 //upload(ftp); // 下載一個(gè)文件 download(ftp); ftp.logout(); ftp.disconnect(); System.out.println("Quit."); } public static void listFile(FTPClient ftp) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("> list"); FTPFile[] ftpFiles; try { ftpFiles = ftp.listFiles(); for (FTPFile f : ftpFiles) { String time = sdf.format(f.getTimestamp().getTime()); String info = ""; if (f.isDirectory()) info = String.format("+ %-20s", f.getName()); else info = String.format(" %-20s %8d %s", f.getName(), f.getSize(), time); System.out.println(info); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 上傳一個(gè)文件 public static void upload(FTPClient ftp) { File localFile = new File("E:\\代碼\\HBiuder.zip"); InputStream inStream; OutputStream outStream; try { String remotePath = ftpPath(localFile.getName()); inStream = new FileInputStream(localFile); // // 小文件直接 用 // ftp.storeFile(remotePath, inStream); //大文件時(shí)用這個(gè)方法 outStream = ftp.storeFileStream(remotePath); // 大文件,可以自己掌握進(jìn)度 byte[] buffer = new byte[4000]; while (true) { int n = inStream.read(buffer); if (n <= 0) break; outStream.write(buffer, 0, n); } inStream.close(); outStream.close(); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //文件下載 public static void download(FTPClient ftp) throws Exception { File localFile = new File("D:/tmp/copy.zip"); localFile.getParentFile().mkdirs(); // String remotePath = ftpPath("/HBiuder.zip"); OutputStream outStream = new FileOutputStream(localFile); // 小文件直接 用 // ftp.retrieveFile(remotePath, outStream); // 大文件,可以自己掌握進(jìn)度 InputStream inStream = ftp.retrieveFileStream(remotePath); if(inStream == null) throw new Exception("遠(yuǎn)程文件不存在!" + remotePath); byte[] buffer = new byte[4000]; while(true) { int n =inStream.read(buffer); if(n <= 0) break; outStream.write(buffer,0,n); } inStream.close(); outStream.close(); } }
僅供參考,如有不足,多多指教。
到此這篇關(guān)于java連接FTP服務(wù)器的文章就介紹到這了,更多相關(guān)java連接FTP服務(wù)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot整合RabbitMQ開發(fā)實(shí)戰(zhàn)詳解
這篇文章主要介紹了Spring Boot整合RabbitMQ開發(fā)實(shí)戰(zhàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02JavaScript實(shí)現(xiàn)鼠標(biāo)移動(dòng)粒子跟隨效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)鼠標(biāo)移動(dòng)粒子跟隨效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08Spring Boot中的WebSocketMessageBrokerConfigurer接口使用
在SpringBoot中,我們可以使用 WebSocketMessageBrokerConfigurer接口來配置WebSocket消息代理,以實(shí)現(xiàn)實(shí)時(shí)通信,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11Java實(shí)現(xiàn)List反轉(zhuǎn)的方法總結(jié)
在Java中,反轉(zhuǎn)一個(gè)List意味著將其元素的順序顛倒,使得第一個(gè)元素變成最后一個(gè),最后一個(gè)元素變成第一個(gè),依此類推,這一操作在處理數(shù)據(jù)集合時(shí)非常有用,所以本文給大家總結(jié)了Java實(shí)現(xiàn)List反轉(zhuǎn)的方法,需要的朋友可以參考下2024-04-04SpringBoot多文件分布式上傳功能實(shí)現(xiàn)
本文詳細(xì)介紹了如何在SpringBoot中實(shí)現(xiàn)多文件分布式上傳,并用代碼給出了相應(yīng)的實(shí)現(xiàn)思路和實(shí)現(xiàn)步驟,感興趣的朋友跟隨小編一起看看吧2023-06-06