1. 程式人生 > >SFTP伺服器檔案拷貝

SFTP伺服器檔案拷貝

專案中用到了SFTP相關的一些東西,之前用到了FTP,個人感覺SFTP和FTP使用起來差不多,網上關於SFTP和FTP的文章很多,這裡就不說了。在這裡說一下我遇到的一些問題。

在專案的要求中,需要讀取檔案的MD5值,進行對比,如果不相同,則進行同步操作。通過ChannelSftp的get方法獲取檔案流,通過put方法將檔案寫到指定位置。而在執行中,程式碼執行到put便停止住,而SFTP服務則一直處於連線狀態。程式碼如下:

//複製檔案
		public void copyfile(ChannelSftp tChannelSftp ,String src) throws  SftpException, IOException {
			InputStream tInputStream = null;
			//建立要拷貝到的資料夾
			tChannelSftp.mkdir(路徑);
			//獲取檔案流
			tInputStream = tChannelSftp.get(src);
			//將讀取到的檔案流寫到指定路徑處
			tChannelSftp.put(tInputStream, 路徑);
			
			tInputStream.close();
		}

檢查伺服器上的檔案後,發現檔案已經正確複製,可是程式碼並不繼續執行。經過多次修改之後,發現是InputStream的問題,而將InputStream拷貝之後再使用,問題便成功解決。

//複製檔案
		public void copyfile(ChannelSftp tChannelSftp ,String src) throws  SftpException, IOException {
			InputStream tInputStream = null;
			
			tChannelSftp.mkdir(路徑);
			
			tInputStream = tChannelSftp.get(src);
			
			//拷貝讀取到的檔案流
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			
			byte[] buffer = new byte[1024];
			int len;
			while ((len = tInputStream.read(buffer)) > -1 ) {
			    baos.write(buffer, 0, len);
			}
			baos.flush();
			
			InputStream nInputStream = new ByteArrayInputStream(baos.toByteArray());
			
			tChannelSftp.put(nInputStream, 路徑);
			
			nInputStream.close();
			baos.close();
			tInputStream.close();
		}

雖然問題解決了,但是其中的原因卻不知道,如果哪位知道原因,歡迎留言。

小白第一次寫部落格,寫的不好,請各位多多見諒,如果幫到了遇到相同問題的你,那真是再好不過了。