FTP简介FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时,它也是一个应用程序(Application)。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)。"下载"文件就是从远程主机拷贝文件至自己的计算机上;"上传"文件就是将文件从自己的计算机中拷贝至远程主机上。用Internet语言来说,用户可通过客户机程序向(从)远程主机上传(下载)文件。
实现简单了解了FTP协议之后,开始代码实现。如果要自己完整实现FTP通讯,其实工作量还有点的,在这个高效率的时代,谁还没事全部自己手写呢?JAVA开源的框架多的去了,这里我们用到的FTP框架是ftp4j-1.7.2 ,里面已经封装好了我们要用的一些函数,如连接远程FTP服务器,登录,列出文件列表,下载文件……
看简单写的一个例子
package com.androiddemo;
import it.sauronsoftware.ftp4j.FTPAbortedException;
import it.sauronsoftware.ftp4j.FTPClient;
import it.sauronsoftware.ftp4j.FTPDataTransferException;
import it.sauronsoftware.ftp4j.FTPException;
import it.sauronsoftware.ftp4j.FTPFile;
import it.sauronsoftware.ftp4j.FTPIllegalReplyException;
import it.sauronsoftware.ftp4j.FTPListParseException;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
private FTPClient client;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FileUtil.init(getApplication());
setContentView(R.layout.activity_main);
new Thread() {
public void run() {
initFtp();
}
}.start();
}
public void initFtp() {
try {
client = new FTPClient();
// 连接我本地的服务器
String[] cInfo = client.connect("113.57.128.59");
for (String string : cInfo) {
println(string);
}
client.login("plant", "plant");
FTPFile[] files = client.list();
for (FTPFile ftpFile : files) {
String fileName = ftpFile.getName();
if (fileName.equals(".") || fileName.equals(".."))
continue;
download(fileName);
}
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FTPIllegalReplyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FTPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FTPDataTransferException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FTPAbortedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FTPListParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void download(String fileName) throws IllegalStateException,
FileNotFoundException, IOException, FTPIllegalReplyException,
FTPException, FTPDataTransferException, FTPAbortedException {
String writePath = FileUtil.getFileDir() + fileName;
client.download(fileName, new File(writePath));
}
void disconnectFtp() {
new Thread() {
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
close();
}
}.start();
}
void close() {
try {
if (client != null)
client.disconnect(true);
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FTPIllegalReplyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FTPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
void println(String text) {
Log.i("FTP", text);
}
@Override
public void finish() {
// TODO Auto-generated method stub
super.finish();
disconnectFtp();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
System.exit(0);
}
}
文件类
package com.androiddemo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import android.content.Context;
import android.os.Environment;
import android.os.StatFs;
/**
* 图片远程下载、保存
*/
public class FileUtil {
private static Context context;
private static String storage = Environment.getExternalStorageState();
private static String fileDir = FileUtil.class.getName() + "/";
public static enum FileType {
JPG, PNG, BMP, RAR, ZIP, SEVENZ, OTHER
};
public static Context getContext() {
return context;
}
public static void init(Context context) {
FileUtil.context = context;
if (isMounted()) {
fileDir = Environment.getExternalStorageDirectory()
.getAbsolutePath() + File.separator + fileDir;
} else {
fileDir = context.getFilesDir().getAbsolutePath() + File.separator
+ fileDir;
}
File file = new File(fileDir);
if (!file.exists())
file.mkdir();
}
/**
* @param fileName
* @return
*/
public static File readFile(String fileName) {
if (fileName == null)
return null;
StringBuffer buffer = new StringBuffer(fileDir);
buffer.append(File.separatorChar);
buffer.append(fileName);
File file = new File(buffer.toString());
if (file.exists())
return file;
return null;
}
public static String getFileType(String fileName) {
int pos = fileName.lastIndexOf(".");
if (pos != -1 && pos < fileName.length()) {
String dot = fileName.substring(pos + 1);
return dot;
}
return "png";
}
/**
* 向SD卡写文件
*
* @param path
* @param data
* @isRecovery 是否覆盖
* @return
*/
public static boolean writeFile(String path, byte[] data, boolean isRecovery) {
try {
File file = new File(path);
if (file.exists() && !isRecovery)
return true;
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
fos.write(data);
fos.flush();
fos.close();
return true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;
}
/**
* 是否挂载SD卡
*
* @return
*/
public static boolean isMounted() {
return storage.equals(Environment.MEDIA_MOUNTED);
}
// 获取本机容量信息
public long phoneCapacity() {
// 获取本机信息
File data = context.getFilesDir();
StatFs statFs = new StatFs(data.getPath());
long availableBlocks = statFs.getAvailableBlocks();// 可用存储块的数量
long size = statFs.getBlockSize();// 每块存储块的大小
long availableSize = availableBlocks * size;// 可用容量
return availableSize;
}
// 获取sdcard容量信息
public long sdcardCapacity() {
// 获取sdcard信息
File sdData = Environment.getExternalStorageDirectory();
StatFs sdStatFs = new StatFs(sdData.getPath());
long sdAvailableBlocks = sdStatFs.getAvailableBlocks();// 可用存储块的数量
long sdSize = sdStatFs.getBlockSize();// 每块存储块的大小
long sdAvailableSize = sdAvailableBlocks * sdSize;
return sdAvailableSize;
}
public static String getFileDir() {
return fileDir;
}
}
执行结果如下图:
然后会在SD卡中创建一个目录,目录下面就有FTP目录对应的文件了。