利用java获取远程文件及使用断点续传供学习者使用

有没有成功      2022-04-27     720

关键词:

闲来没事,就做做,程序还是要多写才好@

原理不说,文件方面及I/O方面,去BAIDU一下就知道,断点续传的原理也很简单,就是在原来已经下载的基础之上继续下载就可以了,用到了这么关键的一句:urlc.setRequestProperty("RANGE", "bytes="+fileSize+"-"); 其它就应该很简单吧.

/**
 * 文件传送客户端:获取远程文件,并采用断点续传原理
 * 软件很简单,写这个东东经历了三个步子:
 * 1、写了一个文件传送程序,基于客户端与服务端
 * 2、写了一个从网上获取文件的程序,学了怎么样使用:HttpURLConnection及URL
 * 3、就是现在这个程序,在2的基础之上加上了断点续传的原理。
 * 不过,功能虽然是达到了,不过,里面还有很多不如意的地方,慢慢改进吧,特别是效率方面
 * 如果有实际需要,可以把这个改成线程的,很简单了哦。
 * 准备做第四个版本:多线程文件下载。
 */

import java.io.BufferedInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;

import java.io.IOException;

import java.io.RandomAccessFile;

import java.net.*;

 

/**
 * 文件传送客户端:获取远程文件
 */
public class GetRemoteFile_Client_GoOn
{
  public GetRemoteFile_Client_GoOn()
  {
  }

  private boolean FileExist(String pathAndFile)//确定文件是否已经下载,但没有下载完成
  {
    File file = new File(pathAndFile);
    if (file.exists())
      return true;
    else
      return false;
  }

  private long FileSize(String pathAndFile)//确定已经下载了的文件大小
  {
    File file = new File(pathAndFile);
    return file.length();
  }
  private void FileRename(String fName,String nName)//将下载完全的文件更名,去掉.tp名
  {
    File file = new File(fName);
    file.renameTo(new File(nName));
    file.delete();
  }
  public static void main(String[] args)
  {
    URL url = null;
    HttpURLConnection urlc = null;
    DataOutputStream dos = null;
    BufferedInputStream bis = null;
    FileOutputStream fos = null;
    String localFile = "d://x.x";//文件保存的地方及文件名,具体情况可以改
    String localFile_bak = localFile + ".tp";//未下载完文件加.tp扩展名,以便于区别
    GetRemoteFile_Client_GoOn gco = new GetRemoteFile_Client_GoOn();
    long fileSize = 0;
    long start = System.currentTimeMillis();
    int len = 0;
    byte[] bt = new byte[1024];
    //byte[] buffer=new byte[50*1024];
    RandomAccessFile raFile=null;
    long TotalSize=0;//要下载的文件总大小
    try
    {
      url = new URL("http://www.netbox.cn/download/nbsetup.EXE");     
      urlc = (HttpURLConnection) url.openConnection();
      TotalSize=Long.parseLong(urlc.getHeaderField("Content-Length"));
      System.out.println("下载文件大小为:"+TotalSize);
      urlc.disconnect();//先断开,下面再连接,否则下面会报已经连接的错误
      urlc = (HttpURLConnection) url.openConnection();
      //确定文件是否存在
      if (gco.FileExist(localFile_bak))//采用断点续传,这里的依据是看下载文件是否在本地有.tp有扩展名同名文件
      {
        System.out.println("文件续传中...");
        fileSize = gco.FileSize(localFile_bak); //取得文件在小,以便确定随机写入的位置
        System.out.println("fileSize:"+fileSize);
        //设置User-Agent
        //urlc.setRequestProperty("User-Agent","NetFox");
        //设置断点续传的开始位置
        urlc.setRequestProperty("RANGE", "bytes="+fileSize+"-");
        //urlc.setRequestProperty("RANGE", "bytes="+fileSize);//这样写不行,不能少了这个"-".
        //设置接受信息
        urlc.setRequestProperty("Accept","image/gif,image/x-xbitmap,application/msword,*/*");       
        raFile=new RandomAccessFile(localFile_bak,"rw");//随机方位读取
        raFile.seek(fileSize);//定位指针到fileSize位置
        bis = new BufferedInputStream(urlc.getInputStream());
        while ((len = bis.read(bt)) > 0)//循环获取文件
        {
          raFile.write(bt, 0, len);
          //buffer=buffer+bt;
          //System.
        }
        System.out.println("文件续传接收完毕!");       
      }
      else//采用原始下载
      {
        fos = new FileOutputStream(localFile_bak); //没有下载完毕就将文件的扩展名命名.bak
        dos = new DataOutputStream(fos);
        bis = new BufferedInputStream(urlc.getInputStream());       
        System.out.println("正在接收文件...");
        int test=0;
        while ((len = bis.read(bt)) > 0)//循环获取文件
        {
          dos.write(bt, 0, len);
          test++;
          if(test==50)//这里是测试,你可以删除这里,就可以正常下载了
            break;
        }       
        //System.out.println("文件正常接收完毕!");
      }     
      System.out.println("共用时:" +
                         (System.currentTimeMillis() - start) / 1000);
      if(bis!=null)
        bis.close();
      if(dos!=null)
        dos.close();
      if(fos!=null)
        fos.close();
      if(raFile!=null)
        raFile.close();
      System.out.println("localFile_bak:"+gco.FileSize(localFile_bak));
      if(gco.FileSize(localFile_bak)==TotalSize)//下载完毕后,将文件重命名
      {
        gco.FileRename(localFile_bak,localFile);
      }
      System.exit(0);
    }
    catch (Exception e)
    {
      try
      {
        if(bis!=null)
          bis.close();
        if(dos!=null)
          dos.close();
        if(fos!=null)
          fos.close();
        if(raFile!=null)
          raFile.close();
      }
      catch (IOException f)
      {
        f.printStackTrace();
      }
      e.printStackTrace();
    }
    System.exit(0);
  }

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow














































































































































用网页实现断点续传(http)

...IO流两个技术点,具体思路如下: 实现思路:1、服:利用ServerSocket搭建服务器,开启相应端口,进行长连接操作2、服:使用ServerSocket.accept()方法进行阻塞,接收客户端请求3、服:每接收到一个Socket就建立一个新的线程来处... 查看详情

jsp利用webuploader实现超大文件分片上传断点续传

​需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制。第一步:前端修改由于项目使用的是BJUI前端框架,并... 查看详情

java实现文件的断点续传

​需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制。第一步:前端修改由于项目使用的是BJUI前端框架,并... 查看详情

java使用webuploader做大文件的分块和断点续传

​需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制。第一步:前端修改由于项目使用的是BJUI前端框架,并... 查看详情

winform实现断点续传的思路及代码

开篇的絮絮叨叨:如果是web,可以考虑使用 使用WebUploader: http://fex.baidu.com/webuploader/getting-started.html工作中需要使用到断点续传,找了好多篇博客,最后的时候在csdn上找到一个项目(文末有链接)。把他的代码拆出来使用... 查看详情

使用js实现可断点续传的文件上传方案(代码片段)

刚开始学习前端开发就碰到文件上传问题,还要求可断点续传。查了很多资料,发现H5的fileAPI刚好可以满足我们的需求,也遇到了一些问题,于是记录下来为有同样需求的朋友提供一些帮助。一、首先,为了引入文件对象,我们... 查看详情

利用java实现断点上传

1.用什么流传2.客户端如何获得上传速度和上传百分比1、Java中用于进行流操作都是java.lang.io包下,如果借助于网络则用Socket。2、获取上传速度可以根据时间量和上传的量得出。至于断点得记录上次已上传的量。参考技术A我以前... 查看详情

html超大文件上传和断点续传的实现

需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制。 第一步:前端修改由于项目使用的是BJUI前端框架,... 查看详情

用asynctask实现断点续传

...p;   在学习四大组件之一的service时,正好可以利用asyncTask和OKhttp来进行断点续传,并在手机的前台显示下载进度。    尝试下载的是Oracle官网上的jdk1.7    在AS中使用OKhttp,只需要简单的在a... 查看详情

scp断点续传

linux命令rsync-P--rsh=sshhomefile.zip[email protected]:/home/remote.zip这个命令的含义:-P断点续传-rshssh远程shellhomefile.zip本地文件[email protected]:/home/remote.zip 远程主机上的目的文件root是远程用户名 查看详情

javaweb断点续传,我用的是fileupload来做的上传。

...s-ioform提交的<inputtype="file">数据在后台要如何获取上传文件的名字?使用Struts2上传文件:Struts文件上传需要使用FileUploadFilter。FilterUploadFilter使用一些默认的规则:Form中的<s:filename="image"></s:file>标签对... 查看详情

vue解决大文件断点续传

​需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制。第一步:前端修改由于项目使用的是BJUI前端框架,并... 查看详情

java中文件大小超过多大需要断点续传

这个不太难吧?假设A给B传文件F(1024字节)。第一次B接收了512字节,那么第二次连接A就应该从513字节开始传输。也就是说,在第二次传输时,B要提供“我要从513字节开始传送文件F”的信息,然后A使用FileInputStream构建输入流读... 查看详情

如何用xmlhttprequest实现大文件上传和断点续传

...一下我的思路吧:首先获取文件的MD5(spark-md5.js),然后利用文件对象的slice方法进行切割文件,分段上传到后台,后台组装文件然后校验MD5值;我也刚好在做,觉得可行本回答被提问者采纳 查看详情

javascript之大文件分段上传断点续传

​需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制。第一步:前端修改由于项目使用的是BJUI前端框架,并... 查看详情

解决php超大文件下载,断点续传下载的方法详解

一、功能性及非功能性需求:文件批量下载,支持断点续传。支持批量下载1000个文件。使用JS能够实现批量下载,能够提供接口从指定url中下载文件并保存在本地指定路径中。服务器不需要打包。支持大文件断点下载。比如下载... 查看详情

断点续传

一、重点!重点!重点!1、设置数据任务task(从路径中获取文件的长度,再判断是否下载过,来请求url,设置Range,将Range添加到请求头中)。2、写入文件(存储下载文件,通过路径设置输出流,并打开,将之前文件取出来,重新设置... 查看详情

文件下载之断点续传(客户端与服务端的实现)

...:http://www.cnblogs.com/zhaopei/p/download.html 阅读目录 文件下载-服务端使用a标签提供文件下载使用Response.TransmitFile提供文件下载其他方式文件下载文件下载-客户端直接下载异步下载断点续传断点续传(服务端的支持)多线程同时... 查看详情