FTP讀取遠端檔案&解決使用FTPClient類時執行緒掛起的問題
阿新 • • 發佈:2019-01-27
一、首先介紹FTP的基本知識(會的直接跳過)
1.什麼是FTP
FTP是File Transfer Protocol(檔案傳輸協議)的英文簡稱,而中文簡稱為“文傳協議”。用於Internet上的控制檔案的雙向傳輸。同時,它也是一個應用程式(Application)。說白了,就是檔案傳輸的規則,方法。與大多數Internet服務一樣,FTP也是一個客戶機/伺服器系統。使用者通過一個支援FTP協議的客戶機程式,連線到在遠端主機上的FTP伺服器程式。使用者通過客戶機程式向伺服器程式發出命令,伺服器程式執行使用者所發出的命令,並將執行的結果返回到客戶機。
2.FTP適合哪種作業系統
常見的作業系統均可以,而且可以說實現在不同作業系統間進行檔案的傳輸
3.一個簡單的FTP使用
①安裝FTP伺服器
SSL那個可以選無SSL證書
②通過客戶端訪問
前提:伺服器電腦關閉了防火牆設定
方法:ftp://要訪問的IP
二、使用java程式碼訪問遠端伺服器並讀取檔案
1.程式碼如下
使用的是FTPClient類,用到的jar包有commons-net-3.3.jar、jakarta-oro-2.0.8.jar、javacsv.jar、jdk為1.8
資源下載
http://download.csdn.net/detail/kunfd/9926398
import java.io.*; import java.net.SocketException; import java.text.ParseException; import java.util.ArrayList; import java.util.List; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; public class FTP { // 設定服務主機的地址,密碼等基本資訊 private String ip = "遠端主機ip"; private String userName = "遠端主機使用者名稱"; private String userPwd = "遠端主機使用者密碼"; private int port = 21; private FTPClient ftpClient = new FTPClient(); public FTP(){ try { connectionServer(ftpClient,ip,port,userName,userPwd); } catch (IOException e) { e.printStackTrace(); } }
//連線遠端伺服器 public void connectionServer(FTPClient ftpClient,String ip,int port,String userName,String userPwd) throws IOException { ftpClient.connect(ip,port);//連線主機,方法繼承於SocketClient ftpClient.login(userName,userPwd);//登入,成功的話返回ture ftpClient.enterLocalPassiveMode();//設定為主動動模式 } //檔案上傳功能 public boolean uploadFile(InputStream iStream, String newName) throws IOException { boolean flag = false; try { ftpClient.setDataTimeout(30000);//設定超時 ftpClient.setSoTimeout(30000); ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE);//設定傳輸模式 flag = ftpClient.storeFile(newName, iStream);//根據輸入流傳輸檔案 } catch (Exception e) { flag = false; return flag; } finally { if (iStream != null) { iStream.close(); } } return flag; } //讀取伺服器上指定檔案並輸出到控制檯 public void readFile(String remote,String pathname) throws IOException { ftpClient.setDataTimeout(30000); ftpClient.setSoTimeout(30000); ftpClient.setFileType(ftpClient.BINARY_FILE_TYPE); ftpClient.changeWorkingDirectory(pathname);//跳轉到指定位置 InputStream in = ftpClient.retrieveFileStream(remote);//開啟指定位置的檔案,返回一個輸入流,給外界讀取 BufferedReader reader = new BufferedReader(new InputStreamReader(in,"UTF-8")); String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } //刪除指定檔案 public void deleteFile(String fileName) { try { ftpClient.deleteFile(fileName); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { FTP ftp = new FTP(); //boolean b= ftp.uploadFile(new BufferedInputStream(new FileInputStream("G:\\test.txt")),"test.txt"); ftp.readFile("test.txt","test"); //ftp.deleteFile("test.txt"); } }
5.FTP的使用注意事項
①防火牆注意事項
②當使用FTPClient中的方法比如上傳setFileType,讀取retrieveFileStream的時候,注意要將FTP設定為被動模式
enterLocalPassiveMode(要不然會導致執行緒掛起)
6.參考內容
http://blog.csdn.net/huanggang028/article/details/41446707