fstp下載轉載的文章,這個很好用,只需要修改你的路徑還有檔名就可以了
本文主要是講解Android伺服器之SFTP伺服器的上傳下載功能,也是對之前所做專案的整理。
主要的程式碼塊如下所示,對程式碼中相應地方稍作調整,複製貼上到專案即可以使用,程式碼中會提供相應註釋。
1.MainActivity
-
public
class MainActivity extends Activity implements OnClickListener{
-
private
final String TAG=
“MainActivity”;
-
private Button buttonUpLoad =
;
-
private
Button buttonDownLoad =
;
-
private SFTPUtils sftp;
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_sftpmain);
-
init();
-
}
-
-
public void init(){
-
//獲取控制元件物件
-
buttonUpLoad = (Button) findViewById(R.id.button_upload);
-
buttonDownLoad = (Button) findViewById(R.id.button_download);
-
//設定控制元件對應相應函式
-
buttonUpLoad.setOnClickListener(
this);
-
buttonDownLoad.setOnClickListener(
this);
-
sftp =
new SFTPUtils(
“SFTP伺服器IP”,
“使用者名稱”,
“密碼”);
-
}
-
public void onClick(final View v) {
-
// TODO Auto-generated method stub
-
new Thread() {
-
@Override
-
public void run() {
-
//這裡寫入子執行緒需要做的工作
-
-
switch (v.getId()) {
-
case R.id.button_upload: {
-
//上傳檔案
-
Log.d(TAG,
“上傳檔案”);
-
String localPath =
“sdcard/xml/”;
-
String remotePath =
“test”;
-
sftp.connect();
-
Log.d(TAG,
“連線成功”);
-
sftp.uploadFile(remotePath,
“APPInfo.xml”, localPath,
“APPInfo.xml”);
-
Log.d(TAG,
“上傳成功”);
-
sftp.disconnect();
-
Log.d(TAG,
“斷開連線”);
-
}
-
break;
-
-
case R.id.button_download: {
-
//下載檔案
-
Log.d(TAG,
“下載檔案”);
-
String localPath =
“sdcard/download/”;
-
String remotePath =
“test”;
-
sftp.connect();
-
Log.d(TAG,
“連線成功”);
-
sftp.downloadFile(remotePath,
“APPInfo.xml”, localPath,
“APPInfo.xml”);
-
Log.d(TAG,
“下載成功”);
-
sftp.disconnect();
-
Log.d(TAG,
“斷開連線”);
-
-
}
-
break;
-
default:
-
break;
-
}
-
}
-
}.start();
-
};
-
}
2.SFTPUtils
-
public
class SFTPUtils {
-
-
private String TAG=
"SFTPUtils";
-
private String host;
-
private String username;
-
private String password;
-
private
int port =
22;
-
private ChannelSftp sftp =
;
-
private Session sshSession =
;
-
-
public SFTPUtils (String host, String username, String password) {
-
this.host = host;
-
this.username = username;
-
this.password = password;
-
}
-
-
/**
-
* connect server via sftp
-
*/
-
public ChannelSftp connect() {
-
JSch jsch =
new JSch();
-
try {
-
sshSession = jsch.getSession(username, host, port);
-
sshSession.setPassword(password);
-
Properties sshConfig =
new Properties();
-
sshConfig.put(
"StrictHostKeyChecking",
"no");
-
sshSession.setConfig(sshConfig);
-
sshSession.connect();
-
Channel channel = sshSession.openChannel(
"sftp");
-
if (channel !=
) {
-
channel.connect();
-
}
else {
-
Log.e(TAG,
"channel connecting failed.");
-
}
-
sftp = (ChannelSftp) channel;
-
}
catch (JSchException e) {
-
e.printStackTrace();
-
}
-
return sftp;
-
}
-
-
-
/**
-
* 斷開伺服器
-
*/
-
public void disconnect() {
-
if (
this.sftp !=
) {
-
if (
this.sftp.isConnected()) {
-
this.sftp.disconnect();
-
Log.d(TAG,
"sftp is closed already");
-
}
-
}
-
if (
this.sshSession !=
) {
-
if (
this.sshSession.isConnected()) {
-
this.sshSession.disconnect();
-
Log.d(TAG,
"sshSession is closed already");
-
}
-
}
-
}
-
-
/**
-
* 單個檔案上傳
-
* @param remotePath
-
* @param remoteFileName
-
* @param localPath
-
* @param localFileName
-
* @return
-
*/
-
public boolean uploadFile(String remotePath, String remoteFileName,
-
String localPath, String localFileName) {
-
FileInputStream in =
;
-
try {
-
createDir(remotePath);
-
System.out.println(remotePath);
-
File file =
new File(localPath + localFileName);
-
in =
new FileInputStream(file);
-
System.out.println(in);
-
sftp.put(in, remoteFileName);
-
System.out.println(sftp);
-
return
true;
-
}
catch (FileNotFoundException e) {
-
e.printStackTrace();
-
}
catch (SftpException e) {
-
e.printStackTrace();
-
}
finally {
-
if (in !=
) {
-
try {
-
in.close();
-
}
catch (IOException e) {
-
e.printStackTrace();
-
}
-
}
-
}
-
return
false;
-
}
-
-
/**
-
* 批量上傳
-
* @param remotePath
-
* @param localPath
-
* @param del
-
* @return
-
*/
-
public boolean bacthUploadFile(String remotePath, String localPath,
-
boolean del) {
-
try {
-
File file =
new File(localPath);
-
File[] files = file.listFiles();
-
for (
int i =
0; i < files.length; i++) {
-
if (files[i].isFile()
-
&& files[i].getName().indexOf(
"bak") == -
1) {
-
synchronized(remotePath){
-
if (
this.uploadFile(remotePath, files[i].getName(),
-
localPath, files[i].getName())
-
&& del) {
-
deleteFile(localPath + files[i].getName());
-
}
-
}
-
}
-
}
-
return
true;
-
}
catch (Exception e) {
-
e.printStackTrace();
-
}
finally {
-
this.disconnect();
-
}
-
return
false;
-
-
}
-
-
/**
-
* 批量下載檔案
-
相關推薦
聽說大牛封裝的Toast,很好用,留下來吧
public class ToastUtils {
private static Toast mToast;
@SuppressLint("ShowToast")
public static void showShortToast(String str) {
一個生成唯一序號的服務,雖然技術不先進,但是很好用
package com.highcom.seqgen.dao.jdbc;import java.sql.*;import javax.sql.*;import org.apache.commons.logging.*;import org.springframework.be
web 本地儲存 (localStorage、sessionStorage),很好用,很強大!!!
web 本地儲存 (localStorage、sessionStorage)
說明
對瀏覽器來說,使用 Web Storage 儲存鍵值對比儲存 Cookie 方式更直觀,而且容量更大,它包含
[工具]微軟的學習平臺Microsoft Learn很好用,推薦一下
## 1. 什麼是Microsoft Learn
![](https://img2020.cnblogs.com/blog/38937/202005/38937-20200512223501111-470141043.png)
[Microsoft Learn](https://docs.micros
我靠,居然如此好用,好神奇!!!
一下為我的洛谷題單。號稱很多人收藏的板子庫。
希望那些符合以下要求的人收藏此題單:
1. 正在學新知識
2. 基礎不牢。
3. NOIP前複習板子
而且還有適合省選選手用的高階版。
[板子庫](https://www.luogu.com.cn/training/12433)
[高階板子庫](https:
針對學習技術的過程,有一篇文章寫的很好
什麽 鏈接 方法 面向 bsp 獲得 甜美 promise 有效 摘自:https://www.zhihu.com/question/29138020/answer/72193349
很多“大牛”都會告誡初學者,用這個用那個,少走彎路,這樣反而把初學者推向了真正的彎路。
經典String str = new String("abc")記憶體分配問題,研究下字串到底該怎麼樣初始化,順便很好的解釋下Java的intern()(在文章結尾)
大佬這個部落格很厲害,解決了我一直以來的困惑;
Java中以下兩句有什麼區別呢?String str1="abc"; String str2=new String("abc");
Java把記憶體劃分成兩種:一種是棧記憶體,一種是堆記憶體。 在函式中定義的一些基本型別
Android Thread之threadLoop方法——(追IMS原始碼時不知怎麼執行到threadLoop方法的,這篇文章有一個很好的解釋)
Android Framework中的執行緒Thread及它的threadLoop方法
在Framework中的Thread普遍的特點就是有一個 threadLoop方法。它到底是怎麼迴圈起來的。
Android中java世界的Thread
先來看看java是怎麼建
Slack 的想法很好啊,很有創新,牛。
海量 發出 有意 頻道 而已 體系 lac ack form [原]https://www.leiphone.com/news/201411/aXHUpe4ZFI2sSwpb.html
由於以往一些用於辦公的應用反響平平,因此對迅速崛起的辦公交流應用Slack,人們議論紛紛
2018年3月19日推薦文章精選 “一周好文,一文打盡”
文章精選 精選 好文 區塊鏈,工作證明(POW)代碼+原理 golang版剖析
作者:64180190簡介:在本文中,我們將討論哈希值。哈希是獲取指定數據的哈希值的過程。 哈希值是對其計算的數據的唯一表示。 哈希函數是一個獲取任意大小的數據並產生固定大小的哈希的函數。 以下是哈希的一些主要功能:
2016,我很好,2017,你好嗎?
2016,第一次坐灰機出差去深圳,感受了遠離霾堵的興奮,也飽嘗著對親人朋友的思念,忍受著咳嗽病魔的騷擾,也收穫了跟一群大牛們一起共事的機會,感受工作的快樂!這是我來了之後的第二個專案,從前期需求,概要設計,實體設計,編碼,我是被架構師罵的最慘的,但是我知道,成長最快的也應該是我。
手機賺錢軟體哪個好用,手機什麼賺錢軟體好?就用搜狐新聞資訊版下載
您知道嗎?
手機賺錢軟體哪個好用?
搜狐新聞資訊版是網路巨頭搜狐公司推出的一個非常好用的手機賺錢軟體,新版搜狐新聞資訊版會定期推出各種送現金活動,獎勵非常豐厚,週期是15天,碰到大型節日比如中秋,元旦,雙11,情人節呀。比如這次的集卡尋寶贏IPHONE .
手機什麼賺錢軟體好?
搜狐新聞資訊版下載
【轉載】機器學習入門好文,強烈推薦
轉載自:https://www.cnblogs.com/subconscious/
強烈推薦--入門必讀
如果你做好準備了,那一定耐心的讀完,你一定會有所收穫。(大概需要10分鐘)
在進入正題前,我想讀者心中可能會有一個疑惑:機器學習有什麼重要性,以至於要閱讀完這篇非常長的文章呢?
CSDN怎麼轉載別人的部落格方法 很好用
自己是新手用了以下方法,感覺很好用 參考部落格原址:http://blog.csdn.net/bolu1234/article/details/51867099 參考部落格原址:https://blog.csdn.net/zh
一個很好用的軟件,可預覽大量文件格式
使用 文件 word 資源管理 資源 流行 一個 targe 額外 Universal Viewer 它可預覽大量文件格式,例如Office文件,圖片,各種網頁和編碼,這樣使用起來就方便多了!圖像超過 40 種格式。也支持從 400+ 照相機的 RAW 圖像,多媒體超過 1
一個很好用的軟體,可預覽大量檔案格式
Universal Viewer 它可預覽大量檔案格式,例如Office檔案,圖片,各種網頁和編碼,這樣使用起來就方便多了!影象超過 40 種格式。也支援從 400+ 照相機的 RAW 影象,多媒體超過 170 種格式,還有word,excel,pdf ,rtf, html,xml等等還可以支援外掛應用程式預
【hssdw25172008的專欄】工作以後,發現平時總要解決很多經典的問題,對於解決的方法,總不知道儲存在哪兒好;經常瀏覽別人的部落格,感覺很好,如果自己可以通過寫博,既保證了學到了知識不被忘卻,還能與更多的朋友交流學習!因此,決定寫博
工作以後,發現平時總要解決很多經典的問題,對於解決的方法,總不知道儲存在哪兒好;經常瀏覽別人的部落格,感覺很好,如果自己可以通過寫博,既保證了學到了知識不被忘卻,還能與更多的朋友交流學習!因此,決定寫博...
資訊熵知乎解釋,感覺很好,幫助理解決策樹演算法
讓我們說人話!好的數學概念都應該是通俗易懂的。
資訊熵,資訊熵,怎麼看怎麼覺得這個“熵”字不順眼,那就先不看。我們起碼知道這個概念跟資訊有關係。而它又是個數學模型裡面的概念,一般而言是可以量化的。所以,第一個問題來了:資訊是不是可以量化?
起碼直覺上而言是可以的,不然怎麼可能我們覺得有些人說的廢話特別多,“
程式設計師:我用eclipse同事說太low,idea很好麼?網友:菜雞互啄!
在程式設計師之間,就喜歡爭,非要分個高低不行,除了計算機語言之爭,還有版本控制工具之爭,用git的鄙視用svn的,當然用svn的也有自己的一套說辭,能說一堆不屑於用git的理由,這都爭了多長時間了,仍是沒有結束,最近又一名網友上演了一個開發工具之爭。
這個網友目前用的開發工具是eclips