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
正在加载信息~
推荐阅读
Android桌面(Launcher应用)背后的故事(九)
最新回复 (0)
站点信息
- 文章2300
- 用户1336
- 访客10861715
每日一句
True success inspires others to act.
真正的成功是激励他人行动。
真正的成功是激励他人行动。
语法错误: 意外的令牌“标识符”
全面理解Gradle - 定义Task
Motrix全能下载工具 (支持 BT / 磁力链 / 百度网盘)
谷歌Pixel正在开始起飞?
获取ElementUI Table排序后的数据
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is
亲测!虚拟机VirtualBox安装MAC OS 10.12图文教程
华为手机app闪退重启界面清空log日志问题
android ndk开发之asm/page.h: not found
手机屏幕碎了怎么备份操作?
免ROOT实现模拟点击任意位置
新手必看修改DSDT教程
thinkpad t470p装黑苹果系统10.13.2
新会员