Java 中如何从 URL 下载文件?

10 Sept 2024 | 5 分钟阅读

在 Java 中从 URL 下载文件是一项相对简单的任务,但有几种不同的方法可以实现。在本篇博文中,我们将讨论两种最常用的方法:使用 URL 和 HttpURLConnection 类,以及使用 Apache Commons IO 库。

通过 URL 下载文件是什么意思?

通过 Java 代码使用 URL 下载文件允许 Java 应用程序直接将文件从远程存储库或其他本地存储下载到本地系统。此过程读取 URL 中的文件并将其写入本地文件。Java 提供了三种不同的方法来通过 URL 下载文件。

1:纯 Java 结构

如果我们不使用任何外部库而使用 Java,它将文件作为输入,并逐字节读取数据。现在,如果我们从输入流中获取逐字节数据,并将字节写入文件输出流,我们就可以通过 URL 实现下载。

URLDownloadFile.java

输出

File downloaded successfully?

2:使用 Java.IO 包

java.io 是传统的 Java 包,其中包含各种类。它包含一些内置类,专门用于流的读写。

我们需要导入 URLConnection、FileOutputStream、IOException、InputStream 和 OutputStream。在 main() 中,创建 OutputStream 和 InputStream 对象,以及两个用于保存 URL 链接和文件位置的字符串变量。在 try 块中,使用 getInputStream() 设置 URL 和 URLConnection。接下来的 catch 块将处理任何输入输出异常并执行 printStackTrace()。finally 块(作为程序的强制部分自动执行)将显示消息“URL 的文件已下载。”

下载文件的步骤。

  • 创建一个 URL 对象,指向我们要下载的文件。
  • 使用 HttpURLConnection 类打开与 URL 的连接。
  • 获取连接的输入流。
  • 创建一个输出流将文件保存到磁盘。
  • 从输入流读取字节,并将它们写入输出流,直到到达文件末尾。
  • 关闭所有流和连接。

让我们在 Java 程序中实现上述步骤。

URLFileDownload.java

输出

URL's File downloaded....

3:使用 NIO

Java NIO(New IO 的缩写)是另一种输入输出 Java API,也作为 Java 包提供。NIO 作为标准 Java IO 和 Java Networking API 的替代方案。在使用 Java IO 库时,流是逐字节读取数据的。但在 Java NIO 包中,数据以通道和缓冲区(channels and buffers)的形式读取。

我们需要导入 URL、Channels(它是 NIO 包的一部分)、FileOutputStream、IOException、InputStream OutputStream 和 java.io.File。现在,在 Main 类中,我们创建了 main()。在 main() 中,在 try 块内,我们创建了两个名为 fileLink 和 oppath 的 String 对象,其中定义了 URL 链接和文件位置。然后,我们为要下载的文件创建了一个输入流。然后,我们需要生成一个负责从该输入流读取数据的新通道。接下来,我们需要创建一个输出流,它将把通道对象中的文件内容写入文件。现在,我们必须从输出流获取通道并定义其内容。接下来的 catch 块将处理任何输入输出异常并执行 printStackTrace()。

PrintStackTrace.java

4:使用 Apache Commons IO

Apache Commons IO 是一个 Java 工具包,其中包含 org.apache.commons.io.FileUtils 类。它包含一个 copyURLToFile 方法,可用于处理 IO 操作。此方法接受两个参数 - 第一个是的作用是指向源文件的 java.net.URL 对象,第二个是指向输出文件路径的 java.io.File 对象。请注意,这两个路径都应以文件名结尾。输出路径应为本地系统上的文件位置,文件将从该位置下载。

首先,我们需要导入 apache.commons.io.FileUtils。在 Main 类中,我们需要创建 main(),然后在其中创建两个 String 变量来保存 URL 链接和文件位置。现在,使用 FileUtils.copyURLToFile() 方法使程序能够(从指定位置)使用(给定的)URL 下载文件。此方法接受我们之前创建的两个参数 fileLink 和 oppath。

DownloadFile.java

输出

File downloaded successfully!