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目录对应的文件了。
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2302
- 用户1336
- 访客10973843
每日一句
Qingming Festival invites us to honor ancestors with quiet reflection and respect.
清明节邀请我们以静思与敬意祭奠祖先。
清明节邀请我们以静思与敬意祭奠祖先。
UAC的限制引起WM_DROPFILES无法响应的解决办法
MeasureSpec中三种模式:UNSPECIFIED,AT_MOST,EXACTLY
发几个实用的chrome插件
CentOS下使用 svnsync迁移SVN代码库
仙剑奇侠传3d回合-PC端辅助
【转载】C++实现EXE加载到内存执行
【收藏】OpenCV一些常用库函数
《闲来麻将》搭建教程
文本转语音系统Spark-TTS
wordpress转xiuno附件自动插入工具
Mac OS最简单及(Karabiner)快捷键设置
使用Putty上传文件?
ndk神奇问题之non-numeric second argument to `wordlist' function: '8.7z'
新会员