0
点赞
收藏
分享

微信扫一扫

102 根据url 下载视频

GG_lyf 2021-09-21 阅读 49
javaJava web

package com.taotao.util;

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

/**
 * 视频下载
 * @author aping
 * @time 2020/5/10 20:26
 */
public class HttpDownload {
    /**
     *
     * @param videoUrl  文件地址
     * @param downloadPath  文件路径
     * @param fileName   文件名称
     * @param SuffixName 文件后缀
     */
    public static boolean downVideo(String videoUrl, String downloadPath, String fileName, String SuffixName) {
        HttpURLConnection connection = null;
        InputStream inputStream = null;
        RandomAccessFile randomAccessFile = null;

        //路径名加上文件名加上后缀名 = 整个文件下载路径
        String fullPathName = downloadPath+fileName+"."+SuffixName;

        try {
            // 1.获取连接对象
            URL url = new URL(videoUrl);
            // 获取链接对象,就是靠这个对象来获取流
            connection = (HttpURLConnection) url.openConnection();
            // Range代表读取的范围,bytes=0-代表从0字节到最大字节,意味着读取所有资源
            connection.setRequestProperty("Range", "bytes=0-");
            // 与网页建立链接,链接成功后就可以获得流;
            connection.connect();
            // 如果建立链接返回的相应代码是200到300间就为成功,否则链接失败,结束函数
            if (connection.getResponseCode() / 100 != 2) {
                System.out.println("连接失败...");
                return false;
            }
            // 2.获取连接对象的流
            inputStream = connection.getInputStream();
            // 已下载的大小 下载进度
            int downloaded = 0;
            // 总文件的大小
            int fileSize = connection.getContentLength();
            // getFile获取此URL的文件名。返回的文件部分将与getPath()相同,具体视频链接的文件名字视情况而定
            // String fileName = url.getFile();
            // fileName = fileName.substring(fileName.lastIndexOf("/") + 1);//特殊需要截取文件名字
            // 3.把资源写入文件
            randomAccessFile = new RandomAccessFile(fullPathName, "rw");
            while (downloaded < fileSize) {
                // 3.1设置缓存流的大小
                //判断当前剩余的下载大小是否大于缓存之,如果不大于就把缓存的大小设为剩余的。
                byte[] buffer = null;
                int MAX_BUFFER_SIZE =4096;
                if (fileSize - downloaded >= MAX_BUFFER_SIZE) {
                    buffer = new byte[MAX_BUFFER_SIZE];
                } else {
                    buffer = new byte[fileSize - downloaded];
                }
                // 3.2把每一次缓存的数据写入文件
                int read = -1;
                int currentDownload = 0;
                long startTime = System.currentTimeMillis();
                // 这段代码是按照缓存的大小,读写该大小的字节。然后循环依次写入缓存的大小,直至结束。
                // 这样的优势在于,不用让硬件频繁的写入,可以提高效率和保护硬盘吧
                while (currentDownload < buffer.length) {
                    read = inputStream.read();
                    buffer[currentDownload++] = (byte) read;
                }
                long endTime = System.currentTimeMillis();
                double speed = 0.0; //下载速度
                if (endTime - startTime > 0) {
                    speed = currentDownload / 1024.0 / ((double) (endTime - startTime) / 1000);
                }
                randomAccessFile.write(buffer);
                downloaded += currentDownload;
                randomAccessFile.seek(downloaded);
                System.out.printf(fullPathName+"下载了进度:%.2f%%,下载速度:%.1fkb/s(%.1fM/s)%n", downloaded * 1.0 / fileSize * 10000 / 100,
                        speed, speed / 1000);
            }

        } catch (MalformedURLException e) {// 具体的异常放到前面
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                //关闭资源、连接
                connection.disconnect();
                inputStream.close();
                randomAccessFile.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return  true;
    }


}


举报

相关推荐

0 条评论