前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用Java实现从网上下载视频

利用Java实现从网上下载视频

作者头像
浩Coding
发布2019-07-03 14:14:22
5.7K2
发布2019-07-03 14:14:22
举报
文章被收录于专栏:浩Coding浩Coding

用Java的IO流可以实现从网上下载视频,当然用Python更简单,就是三五行代码的事情。。。。

代码思路

代码语言:javascript
复制
先建立一个链接对象,获取到网页的链接;
从链接对象获取到输入流,读取数据;
建立一个输出流,向本地文件写入数据。

代码步骤

代码语言:javascript
复制
1.URL url = new URL(videoUrl);
就是获取URL的资源对象,传入的字符串就是对应的地址;
2.HttpURLConnection connection = url.openConnection();
是获取链接对象,就是靠这个对象来获取流;
3.connection.setRequestProperty("Range","bytes=0-");
Range代表读取的范围,bytes=0-代表从0字节到最大字节,意味着读取所有资源
4.connection.connect();
与网页建立李链接,链接成功后就可以获得流;
5.connection.getResponseCode() / 100 != 2
这一个判断代表的是,如果建立链接返回的相应代码是200到300间就为成功,否则链接失败
6.InputStream inputStream = connection.getInputStream();
获取流只需要一行代码,从连接对象直接get。
7.String fileName = url.getFile();
获取文件名称。
8.RandomAccessFile randomAccessFile = new RandomAccessFile(fileName,"rw");
采用RandomAccessFile建立文件写入对象。

代码大致步骤就是这样,没什么技术难度。全部源代码如下:

代码语言:javascript
复制
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
   * 下载视频
   * @param videoUrl 实际视频地址
   * @param downloadPath  文件下载地址
   * @param fileName  文件名
   * @param SuffixName  后缀名
   */
  public static void 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;
      }
      // 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;
        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();
      }
    }
  }

控制台输出结果:

代码语言:javascript
复制
下载了进度:11.59%,下载速度:388.0kb/s(0.4M/s)
下载了进度:23.19%,下载速度:262.5kb/s(0.3M/s)
下载了进度:34.78%,下载速度:261.0kb/s(0.3M/s)
下载了进度:46.38%,下载速度:258.3kb/s(0.3M/s)
下载了进度:57.97%,下载速度:260.0kb/s(0.3M/s)
下载了进度:69.57%,下载速度:260.9kb/s(0.3M/s)
下载了进度:81.16%,下载速度:257.4kb/s(0.3M/s)
下载了进度:92.75%,下载速度:252.3kb/s(0.3M/s)
下载了进度:100.00%,下载速度:286.5kb/s(0.3M/s)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 浩Coding 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档