使用 Java 下载FTP文件

本文介绍如何使用 java.net.URLConnection 类从 FTP 服务器下载远程文件,而无需使用第三方库,如 Apache Commons Net、Tomcat 等。

该技术基于 RFC1738 规范,该规范定义了用于 FTP 访问的 URL 格式。此应用程序从服务器下载文件并列出下载文件的大小和下载所消耗的时间。

客观的

在本教程中,我们将学习:

  • 什么是FTP?
  • 我们如何使用java代码从您的FTP服务器下载文件?
  • 的优点和缺点

什么是FTP?

FTP(文件传输协议)是通过 Internet 交换文件的最简单、最安全的方式。FTP 是一种使用 Internet 在两台远程计算机之间传输文件的快速而可靠的方法。基本的 FTP 连接由调用 FTP 服务器的远程计算机(客户端)组成。FTP 连接以两种方式传输信息:客户端可以从服务器上传内容或将内容下载到服务器。

为了建立连接,只需指示“客户端”连接到特定的 FTP 服务器。

为了通过 FTP 传输文件(上传或下载):

  • 登录已配置为 FTP 服务器的远程计算机。
  • 输入用户名和密码以访问远程系统。
  • 选择远程系统上的特定目录,其中包含您要下载或上传的文件。
  • 将文件传输到系统或从系统传输。

我们如何使用java代码从您的FTP服务器下载文件?

在本文中,我们将学习如何使用java.net.URLConnection 类从FTP 服务器下载远程文件,而不使用Apache、Tomcat 服务器等第三方服务器。该技术基于 RFC1738 规范,该规范定义了 FTP 访问的 URL 格式,如下所示: ftp://username:password@hostname:port/path

此 URL 方案称为 FTP URL,其中:

  • username :是要连接到的 FTP 服务器上的 FTP 帐户的用户名。
  • password : 是用户名对应的密码。
  • hostname :是 FTP 服务器的主机名或 IP 地址。
  • port :是服务器正在侦听的端口号。[默认端口为 21]
  • path :远程文件的路径,格式如下:
<dir1>/<dir2>/.../<dirN>/<name>;type=<typecode>

在哪里:

  • <dir1>/<dir2>/.../<dirN> :是形成特定目录结构的路径元素(单词 <dir> 表示目录)。
  • <名称> :文件/目录名称。
  • :type=<typecode> :这是可选部分。这部分指定传输模式,其中 typecode 可以是以下字符之一:a(ASCII - 文本模式),i(IMAGE - 二进制模式),d(目录列表)。如果这部分被省略或后悔,客户端必须猜测适当的模式。

例如,如果要使用用户oracle 和密码secret下载主机www.myclientserver.com上路径/myproject/2013下的zip 文件Project.zip ,请构造以下URL:ftp://oracle:secret@www。 myclientserver.com/myproject/2013/Project.zip;type=i

将该 URL 粘贴到浏览器的地址栏中,它将处理文件下载。

在 Java 中,我们使用类名:URLConnection 在 FTP URL 上打开连接,然后获取打开的连接的输入流以读取字节数据。使用文件输出流将字节保存到文件中。

例如:

  • String ftpUrl = "ftp://oracle:secret@www.myclientserver.com/myproject/2013/Project.zip;type=i";
  • String saveFile = "Project.zip";
  • URL url = new URL(ftpUrl);
  • URLConnection conn = url.openConnection();
  • InputStream inputStream = conn.getInputStream();
  • FileOutputStream outputStream = new FileOutputStream(saveFile); // reads from inputStream and write to outputStream
 

下面的程序描述了如何使用类 URLConnection 使用 FTP URL 技术在 FTP 服务器上下载文件:

此外,该技术有其自身的优点和缺点,如下所示:

清单 1:Download.java

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.io.File;

class Download {
	private static final int BUFFER_SIZE = 4096;

	public static void main(String args[]) { // this is a function
		long startTime = System.currentTimeMillis();
		String ftpUrl = "ftp://ftp.f-secure.com/misc/unixutil/skeysrcs.zip";
		String file = "";
		// name of the file which has to be download
		String host = ""; // ftp server
		String user = ""; // user name of the ftp server
		String pass = ""; // password of the ftp server
		String savePath = "F:\\skeysrcs.zip";
		ftpUrl = String.format(ftpUrl, user, pass, host);
		System.out.println("Connecting to FTP server");
		try {
			URL url = new URL(ftpUrl);
			URLConnection conn = url.openConnection();
			InputStream inputStream = conn.getInputStream();
			long filesize = conn.getContentLength();
			System.out.println("Size of the file to download in kb is:-" + filesize / 1024);
			FileOutputStream outputStream = new FileOutputStream(savePath);
			byte[] buffer = new byte[BUFFER_SIZE];
			int bytesRead = -1;
			while ((bytesRead = inputStream.read(buffer)) != -1) {
				outputStream.write(buffer, 0, bytesRead);
			}
			long endTime = System.currentTimeMillis();
			System.out.println("File downloaded");
			System.out.println("Download time in sec. is:-" + (endTime - startTime) / 1000);
			outputStream.close();
			inputStream.close();
		} catch (IOException ex) {
			ex.printStackTrace();
		}
	}
}

清单 1 定义了一个 java 文件“Download.java”,它定义了一种机制,使用给定的 url 和有效的用户名和密码连接到 ftp 服务器。一旦使用给定的 ftp url 建立连接,连接将使用提交给 ftp url 的用户名和密码进行身份验证。一个 java.net java API 用于建立覆盖应用程序的网络部分。

这个类定义了类变量:

  • BUFFER_SIZE:一个整数类型的静态变量,它定义了一次要保持下载文件内容的流的缓冲区大小。

还有一个方法:

download():调用下载连接并从服务器下载文件的方法。它还定义了一组变量:

  • startTime : long 类型变量,由当前系统时间初始化,该变量用于列出下载所消耗的时间。
  • ftpUrl:一个字符串类型变量,用于保存将用于连接 ftp 主机的 url 信息。
  • file:命名下载文件的字符串类型变量。
  • host:一个字符串类型变量,列出了要连接的主机的名称。
  • user:用于保存用户名信息的字符串类型变量。
  • password:用于保存密码信息的字符串类型变量。
  • savePath:一个字符串类型变量,保存文件位置以保存下载文件。
  • outputStream : FileOutputStream 类型变量,使用“savePath”变量输出要保存在给定系统位置的下载文件。
  • url:一个 URL 类类型变量,它创建使用 ftpUrl 命中给定主机的请求。
  • buffer:大小为 BUFFER_SIZE 的字节数组。
  • bytesRead:一个整数类型变量,用于保存从服务器接收字节的信息。
  • endTime:当文件下载结束时,当前系统时间的整数类型变量。

下载文件后,下载消耗的时间将与下载的文件大小一起列出。该文件将使用下面列出的逻辑逐字节读取:

while((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead) ; }

一旦文件被下载,我们就有责任关闭打开的 FileOutputStream。要关闭流,我们使用 FileOutputStream 类中定义的 close() 方法。

输入流用于从 ftp 服务器获取数据,它将使用连接类方法接受字节流中的数据。要获取字节流,使用 getInputStream() 方法。使用连接的 getContentLength() 方法获取下载文件。当我们打开输入流时,我们有责任关闭这个流。要关闭输入流,使用 InputStream 类的 close() 方法。

下载文件后,消耗的图块通过从结束时间减去开始时间并将其除以 1000 计算为(结束时间 - 开始时间)/1000)。

清单 2:FtpUrlDownload.java

public class FtpUrlDownload{ public static void main(String[] args){ Download d1 = new Download() ; d1.download() ; try{ Thread.sleep(500) ; } catch(Exception e) { System.out.println(c); } } }

清单 2 定义了一个 java 文件“FtpUrlDownload.java”,它创建了一个“Download”类的实例,并将一个名为“download()”的方法类化,以将文件从给定的服务器 url 下载到下载类中。该类使用连接异常机制,尝试与服务器建立连接、从ftp主机接收数据并保存下载的文件时可能会发生连接异常机制。

好处:

使用简单,不需要第三方FTP工具或应用服务器。

缺点:

灵活性和控制性较差,无法检查 FTP 服务器的响应代码。如果中途下载失败,我们必须重新下载,因为无法恢复上传。

结论:

通过这篇文章,我们了解了 FTP 协议及其使用。在这里,我们使用 java.net API 创建了文件下载应用程序,用于下载给定 url 和用户身份验证信息的应用程序。在这个应用程序中,我们来了解文件下载过程。我们学习,我们如何计算下载文件的大小,文件下载消耗的时间并将文件保存到系统。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
package com.kwantler.YN_EW.service.impl; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class FilePhoto { /** * 从网络Url中下载文件 * * @param urlStr * @param fileName * @param savePath * @throws IOException */ public static void downLoadByUrl(String urlStr, String fileName, String savePath) throws IOException { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 设置超时间为3秒 conn.setConnectTimeout(5 * 1000); // 防止屏蔽程序抓取而返回403错误 conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); // 得到输入流 InputStream inputStream = conn.getInputStream(); // 获取自己数组 byte[] getData = readInputStream(inputStream); // 文件保存位置 File saveDir = new File(savePath); if (!saveDir.exists()) { saveDir.mkdir(); } File file = new File(saveDir + File.separator + fileName); FileOutputStream fos = new FileOutputStream(file); fos.write(getData); if (fos != null) { fos.close(); } if (inputStream != null) { inputStream.close(); } System.out.println("info:" + url + " download success"); } /** * 从输入流中获取字节数组 * * @param inputStream * @return * @throws IOException */ public static byte[] readInputStream(InputStream inputStream) throws IOException { byte[] buffer = new byte[1024]; int len = 0; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while ((len = inputStream.read(buffer)) != -1) { bos.write(buffer, 0, len); } bos.close(); return bos.toByteArray(); } public static void main(String[] args) { try { downLoadByUrl( "https://www.mybiosource.com/images/tds/protocol_samples/MBS700_Antibody_Set_Sandwich_ELISA_Protocol.pdf", "ELISA.pdf", "E:/upload/protocol"); } catch (Exception e) { // TODO: handle exception } } }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值