JAVA通过HTTP协议下载网络文件

这篇具有很好参考价值的文章主要介绍了JAVA通过HTTP协议下载网络文件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        分享一个通过原生的Java代码下载网络资源文件方法,使用URL类连接上网络服务器通过多线程使用I/O流的方式下载文件。

流程:

  • 获取到资源的大小及各项参数
  • 使用RandomAccessFile类生成对应大小的文件用于防止空间不足
  • 启动下载任务线程,传入线程号等参数
  • 下载线程与服务器建立连接,获取到对应的I/O流,将传入的字节写入到下载的本地文件中

线程工作示意图:

JAVA通过HTTP协议下载网络文件

JAVA通过HTTP协议下载网络文件

代码部分:

主程序

import jdk.management.resource.NotifyingMeter;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicLong;

public class Download{

    public static void main(String[] args) throws IOException {
        //1.待下载文件大小
        String url="http://dl.baofeng.com/baofeng5/bf5_new.exe";
        long fileSize=getFileSize(url);
        System.out.println("下载的文件大小:"+fileSize);
        String newFileName=getNewFileName(url);
        System.out.println(newFileName);
        String newFilePath=getNewFilePath(newFileName);
        System.out.println(newFilePath);
        //创建空文件
        createNewFile(fileSize,newFilePath);
        //获取cpu数
        int threadSize=Runtime.getRuntime().availableProcessors();
        //计算每个线程要下载的大小
        long sizePerThread=getSizePerThread(threadSize,fileSize);
        System.out.println("共"+threadSize+"个线程,每个线程下载最多:"+sizePerThread+"个字节");

        for (int i=0;i<threadSize;i++){
            DownloadTaske task=new DownloadTaske(i,fileSize,threadSize,sizePerThread,url,newFilePath);
            Thread t=new Thread(task);
            t.start();
        }

        System.out.println("主线程完成");
    }

    /**
     * 获取文件大小
     * @param url
     * @return
     */
    public static long getFileSize(String url){
        long fileSize=0;
        try {
            URL u=new URL(url);
            HttpURLConnection con= (HttpURLConnection) u.openConnection();
            con.setRequestMethod("HEAD");//请求行:HEAD/xxxHTTP/1.1
            fileSize=con.getContentLength();//获取响应的大小
        }catch (Exception e){
            e.printStackTrace();
        }
        return fileSize;
    }

    /**
     * 生成文件
     * @param url
     * @return
     */
    public static String getNewFileName(String url){
        Date date=new Date();
        DateFormat df=new SimpleDateFormat("yyyyMMddHHmmss");
        String prefix=df.format(date);

        //后缀名
        String suffix=url.substring(url.lastIndexOf("."));
        return prefix+suffix;
    }

    /**
     * 本地文件保存路径
     * @param newFileName
     * @return
     */
    public static String getNewFilePath(String newFileName){
        String userhome="H:\\迅雷下载\\"+ File.separator +newFileName;
        return userhome;
    }

    /**
     * 创建新文件
     * @param fileSize
     * @param newfilePath
     * @return
     * @throws IOException
     */
    public static void createNewFile(long fileSize,String newfilePath) throws IOException {
        RandomAccessFile raf=new RandomAccessFile(newfilePath,"rw");
        raf.setLength(fileSize);
        raf.close();
    }

    /**
     * 计算每个线程要下载的大小
     * @param threadSize
     * @param fileSize
     * @return
     */
    public static long getSizePerThread(int threadSize,long fileSize){
        return fileSize%threadSize==0?fileSize/threadSize:fileSize/threadSize+1;
    }
}

 下载任务类文章来源地址https://www.toymoban.com/news/detail-504795.html

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;

public class DownloadTaske implements Runnable{
    private int i;
    private long fileSize;
    private int threadSize;
    private long sizePerThread;
    private String url;
    private String newFilePath;

    public DownloadTaske(int i, long fileSize, int threadSize, long sizePerThread, String url, String newFilePath) {
        this.i = i;
        this.fileSize = fileSize;
        this.threadSize = threadSize;
        this.sizePerThread = sizePerThread;
        this.url = url;
        this.newFilePath = newFilePath;
    }

    @Override
    public void run() {
        long start=i*sizePerThread;
        long end=(i+1)*sizePerThread-1;
        RandomAccessFile raf=null;
        InputStream iis=null;
        long total=end-start;

        try {
            raf=new RandomAccessFile(newFilePath,"rw");
            raf.seek(start);

            URL urlobj=new URL(url);

            HttpURLConnection con= (HttpURLConnection) urlobj.openConnection();
            con.setRequestMethod("GET");
            con.setRequestProperty("Range","bytes="+start+"-"+end);
            con.setConnectTimeout(10*1000);
            con.connect();

            //开始下载
            iis=new BufferedInputStream(con.getInputStream());
            byte[] bs=new byte[1024*100];
            int length=0;
            while ((length=iis.read(bs,0,bs.length))!=-1){
                raf.write(bs,0,length);
            }
            System.out.println("线程:"+i+"完成");
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if (iis!=null){
                try {
                    iis.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
            if (raf!=null){
                try {
                    raf.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }

        }
    }
}

到了这里,关于JAVA通过HTTP协议下载网络文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C/C++ 通过HTTP实现文件上传下载

    WinInet(Windows Internet)是 Microsoft Windows 操作系统中的一个 API 集,用于提供对 Internet 相关功能的支持。它包括了一系列的函数,使得 Windows 应用程序能够进行网络通信、处理 HTTP 请求、FTP 操作等。WinInet 提供了一套完整的网络通信工具,使得开发者能够轻松地构建支持网络功

    2024年02月19日
    浏览(36)
  • Curl【实例 01】curl下载使用及cmd实例脚本分享(通过请求下载文件)

    Curl 官方下载地址 可下载不同平台不同版本的安装包,本次使用的是Windows解压版本 curl-8.0.1_9-win32-mingw.zip 。 1.1 curl curl是一个开源的命令行工具和库,用于在终端和脚本中进行网络数据传输。它支持多种协议,如HTTP、HTTPS、FTP、SMTP等,可以通过URL进行数据传输和通信。 curl的

    2024年02月07日
    浏览(40)
  • PLC通过HTTP协议JSON文件格式对接MES等系统平台

            智能网关IGT-DSER集成了多种PLC、智能仪表的原厂协议,方便实现各种PLC与MES等系统平台之间的HTTP协议通讯,通过网关的参数配置软件绑定JSON文件的字段与PLC寄存器地址,配置URL,即可通过POST/GET命令,将JSON文件提交给HTTP的服务端; 如果服务端有返回的JSON,网关进行

    2024年02月09日
    浏览(31)
  • vue如何通过$http的post方法请求下载二进制的Excel文件

    使用此function 使用此function, test.vue instanceName: \\\"exportExcel\\\",导出excel文件 instanceName: \\\"downloadLog\\\",下载.log后缀的txt文件 封装接口 代码中使用:

    2024年01月18日
    浏览(37)
  • 三分钟用Golang搭建一个HTTP文件上传下载服务器

    简单需要一个文件服务器来传递数据,只要两个功能,一个上传接口,一个下载接口。 选用go http模块实现,比nginx、ftp等更方便快捷。 上传接口\\\"/v1/file_upload/\\\" 上传接口增加简单BasicAuth鉴权 上传成功返回下载URL json格式返回 只想文件上传服务器测试接口,以下电梯直达即可

    2024年02月11日
    浏览(48)
  • Java通过文件流和文件地址下载文件

    如何使用 MultipartFile 进行文件上传、下载到本地,并返回保存路径呢: 用于在 Spring Boot 应用中获取文件流,然后处理上传的文件,将文件保存到指定目录并返回保存的文件路径。下面对代码的各个部分进行简要介绍: 上传目录设置 :在这个示例中, UPLOAD_DIR 常量用于定义上

    2024年02月12日
    浏览(32)
  • Java【算法 05】通过时间获取8位验证码(每两个小时生成一个)源码分享

    要求是很简单的,每个验证码的有效时间是 2小时 ,这个并不是收到验证码开始计时的,而是每个两小时的时间段使用的是相同的验证码。 将 2个小时处理为相同的值 : 很简单的算法分享。优点: 不需要将生成的验证码缓存。 时间入参,能够重复获取相同的值。

    2024年02月05日
    浏览(22)
  • 【Java网络编程】HTTP超文本传输协议

        HTTP 全称为 Hyper Text Transfer Protocol 超文本传输协议,它是基于 TCP 传输协议构建的应用层协议,作为支撑万维网 www 的核心协议,为了保证其效率及处理大量事务的能力,因此在设计时, HTTP 被制定成为一种无状态协议,也就是说: HTTP 本身不会对发送过的请求和相应的通

    2024年04月09日
    浏览(47)
  • java http远程调用接口下载文件

    远程调用http接口下载文件,接口返回流 一、将文件保存本地 二、将接收到流直接返回

    2024年02月14日
    浏览(34)
  • JAVA Http接口获取文件下载流,将下载的文件上传阿里云

     需要根据,业务数据,将存在第三方平台的数据,下载至本地,或转存阿里云OSS中。

    2024年02月16日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包