原文:http://blog.csdn.net/tianyitianyi1/article/details/38637999


代码部分主要分为三个文件:MainActivity,FTP,ProgressInputStream

1. MainActivity

package com.ftp;import java.io.File;import java.io.IOException;import java.util.LinkedList;import com.ftp.FTP.DeleteFileProgressListener;import com.ftp.FTP.DownLoadProgressListener;import com.ftp.FTP.UploadProgressListener;import android.app.Activity;import android.os.Bundle;import android.os.Message;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;public class MainActivity extends Activity {private static final String TAG = "MainActivity";public static final String FTP_CONNECT_SUCCESSS = "ftp连接成功";public static final String FTP_CONNECT_FAIL = "ftp连接失败";public static final String FTP_DISCONNECT_SUCCESS = "ftp断开连接";public static final String FTP_FILE_NOTEXISTS = "ftp上文件不存在";public static final String FTP_UPLOAD_SUCCESS = "ftp文件上传成功";public static final String FTP_UPLOAD_FAIL = "ftp文件上传失败";public static final String FTP_UPLOAD_LOADING = "ftp文件正在上传";public static final String FTP_DOWN_LOADING = "ftp文件正在下载";public static final String FTP_DOWN_SUCCESS = "ftp文件下载成功";public static final String FTP_DOWN_FAIL = "ftp文件下载失败";public static final String FTP_DELETEFILE_SUCCESS = "ftp文件删除成功";public static final String FTP_DELETEFILE_FAIL = "ftp文件删除失败";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                initView();    }    private void initView() {        //上传功能    //new FTP().uploadMultiFile为多文件上传    //new FTP().uploadSingleFile为单文件上传Button buttonUpload = (Button) findViewById(R.id.button_upload);            buttonUpload.setOnClickListener(new OnClickListener() {                        @Override            public void onClick(View v) {new Thread(new Runnable() {@Overridepublic void run() {                    // 上传                File file = new File("/mnt/sdcard/ftpTest.docx");                    try {                                        //单文件上传new FTP().uploadSingleFile(file, "/fff",new UploadProgressListener(){@Overridepublic void onUploadProgress(String currentStep,long uploadSize,File file) {// TODO Auto-generated method stubLog.d(TAG, currentStep);if(currentStep.equals(MainActivity.FTP_UPLOAD_SUCCESS)){Log.d(TAG, "-----shanchuan--successful");} else if(currentStep.equals(MainActivity.FTP_UPLOAD_LOADING)){long fize = file.length();float num = (float)uploadSize / (float)fize;int result = (int)(num * 100);Log.d(TAG, "-----shangchuan---"+result + "%");}}});} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();                                 }        });        //下载功能    Button buttonDown = (Button)findViewById(R.id.button_down);    buttonDown.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {new Thread(new Runnable() {@Overridepublic void run() {                    // 下载                    try {                                        //单文件下载                    new FTP().downloadSingleFile("/fff/ftpTest.docx","/mnt/sdcard/download/","ftpTest.docx",new DownLoadProgressListener(){@Overridepublic void onDownLoadProgress(String currentStep, long downProcess, File file) {Log.d(TAG, currentStep);if(currentStep.equals(MainActivity.FTP_DOWN_SUCCESS)){Log.d(TAG, "-----xiazai--successful");} else if(currentStep.equals(MainActivity.FTP_DOWN_LOADING)){Log.d(TAG, "-----xiazai---"+downProcess + "%");}}                                        });                                        } catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();}});        //删除功能    Button buttonDelete = (Button)findViewById(R.id.button_delete);    buttonDelete.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {new Thread(new Runnable() {@Overridepublic void run() {                    // 删除                    try {                    new FTP().deleteSingleFile("/fff/ftpTest.docx",new DeleteFileProgressListener(){@Overridepublic void onDeleteProgress(String currentStep) {Log.d(TAG, currentStep);if(currentStep.equals(MainActivity.FTP_DELETEFILE_SUCCESS)){Log.d(TAG, "-----shanchu--success");} else if(currentStep.equals(MainActivity.FTP_DELETEFILE_FAIL)){Log.d(TAG, "-----shanchu--fail");}}                                        });                                        } catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();}});        }}

2. FTP

package com.ftp;import java.io.BufferedInputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.Date;import java.util.LinkedList;import org.apache.commons.net.ftp.FTPClient;import org.apache.commons.net.ftp.FTPClientConfig;import org.apache.commons.net.ftp.FTPFile;import org.apache.commons.net.ftp.FTPReply;public class FTP {/** * 服务器名. */private String hostName;/** * 端口号 */private int serverPort;/** * 用户名. */private String userName;/** * 密码. */private String password;/** * FTP连接. */private FTPClient ftpClient;public FTP() {this.hostName = "192.168.1.101";this.serverPort = 21;this.userName = "admin";this.password = "1234";this.ftpClient = new FTPClient();}// -------------------------------------------------------文件上传方法------------------------------------------------/** * 上传单个文件. *  * @param localFile *            本地文件 * @param remotePath *            FTP目录 * @param listener *            监听器 * @throws IOException */public void uploadSingleFile(File singleFile, String remotePath,UploadProgressListener listener) throws IOException {// 上传之前初始化this.uploadBeforeOperate(remotePath, listener);boolean flag;flag = uploadingSingle(singleFile, listener);if (flag) {listener.onUploadProgress(MainActivity.FTP_UPLOAD_SUCCESS, 0,singleFile);} else {listener.onUploadProgress(MainActivity.FTP_UPLOAD_FAIL, 0,singleFile);}// 上传完成之后关闭连接this.uploadAfterOperate(listener);}/** * 上传多个文件. *  * @param localFile *            本地文件 * @param remotePath *            FTP目录 * @param listener *            监听器 * @throws IOException */public void uploadMultiFile(LinkedList fileList, String remotePath,UploadProgressListener listener) throws IOException {// 上传之前初始化this.uploadBeforeOperate(remotePath, listener);boolean flag;for (File singleFile : fileList) {flag = uploadingSingle(singleFile, listener);if (flag) {listener.onUploadProgress(MainActivity.FTP_UPLOAD_SUCCESS, 0,singleFile);} else {listener.onUploadProgress(MainActivity.FTP_UPLOAD_FAIL, 0,singleFile);}}// 上传完成之后关闭连接this.uploadAfterOperate(listener);}/** * 上传单个文件. *  * @param localFile *            本地文件 * @return true上传成功, false上传失败 * @throws IOException */private boolean uploadingSingle(File localFile,UploadProgressListener listener) throws IOException {boolean flag = true;// 不带进度的方式// // 创建输入流// InputStream inputStream = new FileInputStream(localFile);// // 上传单个文件// flag = ftpClient.storeFile(localFile.getName(), inputStream);// // 关闭文件流// inputStream.close();// 带有进度的方式BufferedInputStream buffIn = new BufferedInputStream(new FileInputStream(localFile));ProgressInputStream progressInput = new ProgressInputStream(buffIn,listener, localFile);flag = ftpClient.storeFile(localFile.getName(), progressInput);buffIn.close();return flag;}/** * 上传文件之前初始化相关参数 *  * @param remotePath *            FTP目录 * @param listener *            监听器 * @throws IOException */private void uploadBeforeOperate(String remotePath,UploadProgressListener listener) throws IOException {// 打开FTP服务try {this.openConnect();listener.onUploadProgress(MainActivity.FTP_CONNECT_SUCCESSS, 0,null);} catch (IOException e1) {e1.printStackTrace();listener.onUploadProgress(MainActivity.FTP_CONNECT_FAIL, 0, null);return;}// 设置模式ftpClient.setFileTransferMode(org.apache.commons.net.ftp.FTP.STREAM_TRANSFER_MODE);// FTP下创建文件夹ftpClient.makeDirectory(remotePath);// 改变FTP目录ftpClient.changeWorkingDirectory(remotePath);// 上传单个文件}/** * 上传完成之后关闭连接 *  * @param listener * @throws IOException */private void uploadAfterOperate(UploadProgressListener listener)throws IOException {this.closeConnect();listener.onUploadProgress(MainActivity.FTP_DISCONNECT_SUCCESS, 0, null);}// -------------------------------------------------------文件下载方法------------------------------------------------/** * 下载单个文件,可实现断点下载. *  * @param serverPath *            Ftp目录及文件路径 * @param localPath *            本地目录 * @param fileName        *            下载之后的文件名称 * @param listener *            监听器 * @throws IOException */public void downloadSingleFile(String serverPath, String localPath, String fileName, DownLoadProgressListener listener)throws Exception {// 打开FTP服务try {this.openConnect();listener.onDownLoadProgress(MainActivity.FTP_CONNECT_SUCCESSS, 0, null);} catch (IOException e1) {e1.printStackTrace();listener.onDownLoadProgress(MainActivity.FTP_CONNECT_FAIL, 0, null);return;}// 先判断服务器文件是否存在FTPFile[] files = ftpClient.listFiles(serverPath);if (files.length == 0) {listener.onDownLoadProgress(MainActivity.FTP_FILE_NOTEXISTS, 0, null);return;}//创建本地文件夹File mkFile = new File(localPath);if (!mkFile.exists()) {mkFile.mkdirs();}localPath = localPath + fileName;// 接着判断下载的文件是否能断点下载long serverSize = files[0].getSize(); // 获取远程文件的长度File localFile = new File(localPath);long localSize = 0;if (localFile.exists()) {localSize = localFile.length(); // 如果本地文件存在,获取本地文件的长度if (localSize >= serverSize) {File file = new File(localPath);file.delete();}}// 进度long step = serverSize / 100;long process = 0;long currentSize = 0;// 开始准备下载文件OutputStream out = new FileOutputStream(localFile, true);ftpClient.setRestartOffset(localSize);InputStream input = ftpClient.retrieveFileStream(serverPath);byte[] b = new byte[1024];int length = 0;while ((length = input.read(b)) != -1) {out.write(b, 0, length);currentSize = currentSize + length;if (currentSize / step != process) {process = currentSize / step;if (process % 5 == 0) {  //每隔%5的进度返回一次listener.onDownLoadProgress(MainActivity.FTP_DOWN_LOADING, process, null);}}}out.flush();out.close();input.close();// 此方法是来确保流处理完毕,如果没有此方法,可能会造成现程序死掉if (ftpClient.completePendingCommand()) {listener.onDownLoadProgress(MainActivity.FTP_DOWN_SUCCESS, 0, new File(localPath));} else {listener.onDownLoadProgress(MainActivity.FTP_DOWN_FAIL, 0, null);}// 下载完成之后关闭连接this.closeConnect();listener.onDownLoadProgress(MainActivity.FTP_DISCONNECT_SUCCESS, 0, null);return;}// -------------------------------------------------------文件删除方法------------------------------------------------/** * 删除Ftp下的文件. *  * @param serverPath *            Ftp目录及文件路径 * @param listener *            监听器 * @throws IOException */public void deleteSingleFile(String serverPath, DeleteFileProgressListener listener)throws Exception {// 打开FTP服务try {this.openConnect();listener.onDeleteProgress(MainActivity.FTP_CONNECT_SUCCESSS);} catch (IOException e1) {e1.printStackTrace();listener.onDeleteProgress(MainActivity.FTP_CONNECT_FAIL);return;}// 先判断服务器文件是否存在FTPFile[] files = ftpClient.listFiles(serverPath);if (files.length == 0) {listener.onDeleteProgress(MainActivity.FTP_FILE_NOTEXISTS);return;}//进行删除操作boolean flag = true;flag = ftpClient.deleteFile(serverPath);if (flag) {listener.onDeleteProgress(MainActivity.FTP_DELETEFILE_SUCCESS);} else {listener.onDeleteProgress(MainActivity.FTP_DELETEFILE_FAIL);}// 删除完成之后关闭连接this.closeConnect();listener.onDeleteProgress(MainActivity.FTP_DISCONNECT_SUCCESS);return;}// -------------------------------------------------------打开关闭连接------------------------------------------------/** * 打开FTP服务. *  * @throws IOException */public void openConnect() throws IOException {// 中文转码ftpClient.setControlEncoding("UTF-8");int reply; // 服务器响应值// 连接至服务器ftpClient.connect(hostName, serverPort);// 获取响应值reply = ftpClient.getReplyCode();if (!FTPReply.isPositiveCompletion(reply)) {// 断开连接ftpClient.disconnect();throw new IOException("connect fail: " + reply);}// 登录到服务器ftpClient.login(userName, password);// 获取响应值reply = ftpClient.getReplyCode();if (!FTPReply.isPositiveCompletion(reply)) {// 断开连接ftpClient.disconnect();throw new IOException("connect fail: " + reply);} else {// 获取登录信息FTPClientConfig config = new FTPClientConfig(ftpClient.getSystemType().split(" ")[0]);config.setServerLanguageCode("zh");ftpClient.configure(config);// 使用被动模式设为默认ftpClient.enterLocalPassiveMode();// 二进制文件支持ftpClient.setFileType(org.apache.commons.net.ftp.FTP.BINARY_FILE_TYPE);}}/** * 关闭FTP服务. *  * @throws IOException */public void closeConnect() throws IOException {if (ftpClient != null) {// 退出FTPftpClient.logout();// 断开连接ftpClient.disconnect();}}// ---------------------------------------------------上传、下载、删除监听---------------------------------------------/* * 上传进度监听 */public interface UploadProgressListener {public void onUploadProgress(String currentStep, long uploadSize, File file);}/* * 下载进度监听 */public interface DownLoadProgressListener {public void onDownLoadProgress(String currentStep, long downProcess, File file);}/* * 文件删除监听 */public interface DeleteFileProgressListener {public void onDeleteProgress(String currentStep);}}

3. ProgressInputStream

package com.ftp;import java.io.File;import java.io.IOException;import java.io.InputStream;import com.ftp.FTP.UploadProgressListener;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;public class ProgressInputStream extends InputStream {    private static final int TEN_KILOBYTES = 1024 * 10;  //每上传10K返回一次    private InputStream inputStream;    private long progress;    private long lastUpdate;    private boolean closed;        private UploadProgressListener listener;    private File localFile;    public ProgressInputStream(InputStream inputStream,UploadProgressListener listener,File localFile) {        this.inputStream = inputStream;        this.progress = 0;        this.lastUpdate = 0;        this.listener = listener;        this.localFile = localFile;                this.closed = false;    }    @Override    public int read() throws IOException {        int count = inputStream.read();        return incrementCounterAndUpdateDisplay(count);    }    @Override    public int read(byte[] b, int off, int len) throws IOException {        int count = inputStream.read(b, off, len);        return incrementCounterAndUpdateDisplay(count);    }    @Override    public void close() throws IOException {        super.close();        if (closed)            throw new IOException("already closed");        closed = true;    }    private int incrementCounterAndUpdateDisplay(int count) {        if (count > 0)            progress += count;        lastUpdate = maybeUpdateDisplay(progress, lastUpdate);        return count;    }    private long maybeUpdateDisplay(long progress, long lastUpdate) {        if (progress - lastUpdate > TEN_KILOBYTES) {            lastUpdate = progress;            this.listener.onUploadProgress(MainActivity.FTP_UPLOAD_LOADING, progress, this.localFile);        }        return lastUpdate;    }          }



更多相关文章

  1. Android固件img文件的解包, 修改和打包的命令行操作
  2. Android判断是否有网络连接
  3. Android(安卓)zip文件压缩解压缩
  4. android读取ini文件
  5. android用异步操作AsyncTask编写文件查看器
  6. Android中判断app是否连接网络
  7. Android(安卓)使用MediaPlayer播放assets目录的音频文件
  8. Android下载文件保存到路径
  9. NPM 和webpack 的基础使用

随机推荐

  1. Michael Jordan获2020 IEEE冯诺依曼奖,曾
  2. 高通下一代旗舰骁龙865正式发布:外挂「真5
  3. 上线俩月,TensorFlow 2.0被吐槽太难用,网友
  4. Virtual Apps and Desktops 2103版发布
  5. 【uni-app】引入阿里巴巴图标库
  6. 用 Python 来了解一下《安家》
  7. 让隐藏视窗的Dock成半透明状态
  8. 【微信小程序】自定义导航栏(一)
  9. 【微信小程序】自定义导航栏(二)
  10. 如何在Safari浏览器中设置活跃及其他网站