1. 程式人生 > >FTP讀取遠端檔案&解決使用FTPClient類時執行緒掛起的問題

FTP讀取遠端檔案&解決使用FTPClient類時執行緒掛起的問題

一、首先介紹FTP的基本知識(會的直接跳過)

1.什麼是FTP

FTPFile 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.jarjakarta-oro-2.0.8.jarjavacsv.jarjdk1.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