您的位置:

Java HTTP下载文件详解

一、HTTP下载概述

HTTP下载指的是从服务器上下载文件到本地电脑。我们通常使用HTTP协议来进行文件的上传和下载,HTTP协议是应用层协议,也是一种无状态的协议,因此HTTP下载的过程相较于其他协议而言,更加简单。

二、Java HTTP下载的基本流程

Java通过URLConnection和HttpURLConnection类支持HTTP协议,可以很方便的完成HTTP下载文件的功能。HTTP下载的基本流程如下:

1. 创建URL对象,指定下载文件的URL地址;

2. 打开URL对象的连接;

3. 创建HttpURLConnection对象,并进行配置(比如设置请求方法、请求头、连接和读取超时时间等等);

4. 获取到服务器响应的码,判断是否连接成功;

5. 读取服务器响应的数据流,并将下载的文件存储到本地;

6. 关闭连接。

三、Java HTTP下载的实现

1、设置请求头

URL url = new URL(fileurl);//fileurl为文件下载路径
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

在创建HttpURLConnection对象之后,我们可以设置请求头,此处设置了一个User-Agent请求头,用于伪装成浏览器进行下载,提高下载成功率。

2、设置下载位置

File file = new File(path + "/" + fileName);//下载文件存放路径及文件名
RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
randomAccessFile.seek(startPos);

若需要支持断点续传,并设置从某个位置开始下载,则需要通过RandomAccessFile类设置下载位置。

3、分片下载文件

InputStream input = conn.getInputStream();
byte[] buffer = new byte[1024];
int length = 0;
long tempSize = startPos;//设置下载起始位置
while ((length = input.read(buffer)) != -1) {
    randomAccessFile.write(buffer, 0, length);
    tempSize += length;
    if (tempSize > endPos) {
        break;
    }
}

若资源文件太大,需要进行分片下载则可以在代码中设置下载文件的起始位置和结束位置并分段接收文件信息,以此达到分段下载的效果。

4、完整代码示例

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

public class HttpDownload {
    public static void main(String[] args) {
        String fileurl = "https://example.com/example.zip";
        String path = "D:/download";//下载目录
        String fileName = "example.zip";//下载文件名

        //设置下载起始位置和结束位置
        long startPos = 0L;
        long endPos = 1024L * 10240L;

        try {
            URL url = new URL(fileurl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");

            File file = new File(path + "/" + fileName);
            RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
            randomAccessFile.seek(startPos);

            InputStream input = conn.getInputStream();
            byte[] buffer = new byte[1024];
            int length = 0;
            long tempSize = startPos;
            while ((length = input.read(buffer)) != -1) {
                randomAccessFile.write(buffer, 0, length);
                tempSize += length;
                if (tempSize > endPos) {
                    break;
                }
            }

            randomAccessFile.close();
            input.close();
            conn.disconnect();
            System.out.println("文件下载完毕!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

四、HTTP下载的常见异常

1、java.net.SocketTimeoutException: Read timed out

这个异常通常是连接超时引起的,可以通过设置连接和读取超时时间来避免这个问题。

2、java.io.FileNotFoundException

这个异常通常是指定的URL地址不存在或者下载的文件路径不正确,需要确认URL地址是否正确或者文件路径是否正确。

3、java.io.IOException: Server returned HTTP response code: 403

这个异常通常是因为下载文件地址URL受到权限或者用户名、密码等限制导致的,需要在设置请求头中加入相应的授权信息。

至此,Java HTTP下载文件的详解便结束了,以上是该教程的全部内容。