关于apache FTP下载速度慢的解决方案

最近公司有一个项目,需要使用FTP进行文件的上传下载,以前写的FTP下载速度始终在2Mb/s,经过改进速度达到6Mb/s。

测试了很长时间才找到原因:

/**
	 * 下载服务器上的文件或者文件夹
	 * @param ftpFileName 服务器上的文件夹名或者文件名
	 * @param localDir 下载到设备上的路径
	 * @param return 下载的文件数目
	 */
	private int downFileOrDir(String ftpFileName, String localDir, int downloadFileCount) {
		Message downloadFileMsg;
		downloadFileMsg = mHandler.obtainMessage();
		int downloadCount = 0;
		try {
			File file = new File(ftpFileName);
			File temp = new File(localDir);
			if (!temp.exists()) {
				temp.mkdirs();
			}
			// 判断是否是目录
			if (isDir(ftpFileName)) {
				String[] names = ftpClient.listNames();
				for (int i = 0; i < names.length; i++) {
					if (isDir(names[i])) {
						downFileOrDir(ftpFileName + '/' + names[i], localDir
								+ File.separator + names[i], downloadFileCount);
						ftpClient.changeToParentDirectory();
					} else {
						File localfile = new File(localDir + File.separator
								+ names[i]);
						if (!localfile.exists()) {
							fos = new FileOutputStream(localfile);
							ftpClient.retrieveFile(names[i], fos);
						} else {
							// 开始删除文件
							file.delete();
							fos = new FileOutputStream(localfile);
							ftpClient.retrieveFile(ftpFileName, fos);
						}
					}
				}
			} else {
				downloadCount = downloadFileCount + 1;
				File localfile = new File(localDir + File.separator
						+ file.getName());
				if (!localfile.exists()) {
					fos = new FileOutputStream(localfile);
					ftpClient.retrieveFile(ftpFileName, fos);
				} else {
					// 开始删除文件
					file.delete();
					fos = new FileOutputStream(localfile);
					ftpClient.retrieveFile(ftpFileName, fos);
				}
				ftpClient.changeToParentDirectory();
				
			}
		} catch (SocketException e) {
			e.printStackTrace();
			
		} catch (IOException e) {
			e.printStackTrace();
			
		} 
		return downloadCount;
	}

// 判断是否是目录
	public boolean isDir(String fileName) {
		try {
			// 切换目录,若当前是目录则返回true,否则返回true。
			boolean falg = ftpClient.changeWorkingDirectory(fileName);
			return falg;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}
以前是用上面的方法进行的下载,下载速度始终很慢。

提高速度的方法是:

ftpClient.retrieveFile(ftpFileName, fos);

改成

<span style="white-space:pre">					</span>// 进度
					long step = serverSize / 100;
					long process = 0;
					long currentSize = 0;
					// 开始准备下载文件
					OutputStream out = new FileOutputStream(localFile, true);
					ftpClient.setRestartOffset(localSize);
					InputStream input = ftpClient.retrieveFileStream(names[j]);
					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 % 1 == 0) { // 每隔%5的进度返回一次
								//进度
							}
						}
					}
					out.flush();
					out.close();
					input.close();

					// 此方法是来确保流处理完毕,如果没有此方法,可能会造成现程序死掉
					if (ftpClient.completePendingCommand()) {
						//成功
					} else {
						//失败
					}
修改后的下载速度大幅度提高

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值